import App from "./components/App.svelte"
import { location } from "./store"
import { apiBaseURL } from "./config"

import "./i18n"

console.log("API Base: ", apiBaseURL)

// update location store
const publishLocation = (_p?: string) => {
    const push = !!_p
    if (!_p && typeof window !== "undefined") {
        _p = window.location?.pathname + window.location?.search
    }
    let _s: string
    if (_p) {
        const parts = _p.split("?")
        _p = parts.shift()
        _s = parts.join()
        if (_s) _s = "?" + _s
    }

    const newLocation = {
        path: _p,
        search: _s,
        push,
        pop: !push,
    }
    location.set(newLocation)
}

// history proxy for location store update
if (typeof history !== "undefined") {
    if (typeof Proxy !== "undefined") {
        // modern browser
        const historyApply = (target, thisArg, argumentsList) => {
            publishLocation(argumentsList && argumentsList.length >= 2 && argumentsList[2])
            Reflect.apply(target, thisArg, argumentsList)
        }

        history.pushState = new Proxy(history.pushState, {
            apply: historyApply,
        })

        history.replaceState = new Proxy(history.replaceState, {
            apply: historyApply,
        })
    } else {
        // ie11
        const pushStateFn = history.pushState
        const replaceStateFn = history.replaceState

        history.pushState = function (data: any, title: string, url?: string) {
            publishLocation(url)
            return pushStateFn.apply(history, arguments)
        }
        history.replaceState = function (data: any, title: string, url?: string) {
            publishLocation(url)
            return replaceStateFn.apply(history, arguments)
        }
    }
} // else ssr -> no history handling

typeof window !== "undefined" &&
    window.addEventListener("popstate", (event) => {
        publishLocation()
    })

let appContainer = document?.getElementById("appContainer")

const hydrate = true //import.meta?.env?.MODE !== "development"
console.log("Features: ", { hydrate })
const app = new App({
    target: appContainer,
    props: {},
    hydrate,
})

export default app

// PWA
if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
    console.log("Registering service worker")
    navigator.serviceWorker
        .register("/serviceworker.js", { scope: "/" })
        .then((reg) => {
            console.log("Registration succeeded. Scope is " + reg.scope)
        })
        .catch((e) => {
            console.log("Registration failed:", e)
        })
}
