/*
 PWA Installer
 */
console.log('PWA gestartet');

var deferredPrompt = deferredPrompt || null;
let isPWAInstalled = false;
let version = "2.2.5";

let manifest = null;

async function loadManifest() {
    if (manifest) return manifest; // Reuse
    const response = await fetch("manifest.json");
    manifest = await response.json();
    return manifest;
}

async function requestNotificationPermission() {
    if (!("Notification" in window)) {
        console.warn("Benachrichtigungen werden vom Browser nicht unterstützt.");
        return;
    }

    const permission = await Notification.requestPermission();
    if (permission === "granted") {
        console.log("[PWA] ✅ Benachrichtigungen erlaubt.");
        new Notification("🎉 JPX wurde installiert!");
    } else {
        console.warn("[PWA] ❌ Benachrichtigungen wurden abgelehnt.");
    }
}

document.addEventListener("DOMContentLoaded", async function () {
    if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {
        // Lade start_url aus manifest
        const manifest = await loadManifest();
        const startUrl = manifest.start_url || "/de/";

        console.log("[PWA] Sende start_url an SW:", startUrl);
        navigator.serviceWorker.controller.postMessage({ startUrl });
    }
    const installicon = document.getElementById("install-icon")

    try {
        // Manifest.json laden und App-Daten setzen
        manifest = await loadManifest();
        if(installicon){
            bindInstallButton();
            document.getElementById("install-icon").src = manifest.icons ? manifest.icons[0].src : "/fileadmin/Public/Images/Favicons/Messe/android-chrome-144x144.png";
            document.getElementById("install-text").innerText = `Installiere ${manifest.name || "unsere App"}!`;

        }
    } catch (error) {
        console.error("[PWA] Fehler beim Laden des Manifests:", error);
    }

    // Prüfen, ob die App bereits installiert ist
    isPWAInstalled = window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true;

    if (isPWAInstalled) {
        console.log("[PWA] Die App ist bereits installiert.");
        return; // Keine Installation erforderlich
    }

    // Event: Installationsaufforderung abfangen
    window.addEventListener("beforeinstallprompt", (e) => {
        console.log("[PWA] beforeinstallprompt ausgelöst.");
        e.preventDefault();
        deferredPrompt = e;
        const banner = document.getElementById("install-banner");
        if (banner) {
            banner.style.display = "block";
        } else {
            console.warn("[PWA] Installationsbanner nicht gefunden.");
        }
        // Optional: Button anzeigen, der dann das Banner auslöst
        const installBtn = document.getElementById('install-icon');
        if (installBtn) {
            installBtn.style.display = 'block';
            installBtn.addEventListener('click', async () => {
                installBtn.style.display = 'none';

                if (deferredPrompt) {
                    console.log("[PWA] Zeige Installationsbanner...");
                    deferredPrompt.prompt();
                    const { outcome } = await deferredPrompt.userChoice;
                    console.log(`[PWA] Benutzerentscheidung: ${outcome}`);
                    deferredPrompt = null;
                } else {
                    console.log("[PWA] Kein gespeichertes Prompt vorhanden.");
            }
            });
        } else {
            console.warn("[PWA] Kein install-icon im DOM gefunden.");
        }


    });

    // Installationsbutton: PWA Installation starten
    document.getElementById("install-btn")?.addEventListener("click", async () => {
        if (!deferredPrompt) {
            console.log("[PWA] Kein Installations-Prompt verfügbar.");
            return;
        }

        try {
            await deferredPrompt.prompt(); // Muss innerhalb einer Benutzeraktion erfolgen
            const choiceResult = await deferredPrompt.userChoice;

            if (choiceResult.outcome === "accepted") {
                console.log("[PWA] Installation akzeptiert!");
                // Jetzt Service Worker registrieren
                if ('serviceWorker' in navigator) {
                    navigator.serviceWorker.register("/sw.js")
                        .then(reg => console.log("[PWA] SW nachträglich registriert:", reg.scope))
                        .catch(err => console.error("[PWA] Fehler bei SW-Registrierung:", err));
                        navigator.serviceWorker.addEventListener("controllerchange", () => {
                            console.log("[PWA] Neuer SW aktiv – Seite wird neu geladen.");
                            window.location.reload();
                        });
                }
                requestNotificationPermission();
            } else {
                console.log("[PWA] Installation abgelehnt.");
            }

            // Banner ausblenden
            deferredPrompt = null;
            document.getElementById("install-banner").style.display = "none";
        } catch (error) {
            console.error("[PWA] Fehler beim Installationsversuch:", error);
        }
    });

    // Schließen-Button für das Banner
    document.getElementById("close-banner")?.addEventListener("click", () => {
        document.getElementById("install-banner").style.display = "none";
    });
});
if ('serviceWorker' in navigator) {
    window.addEventListener('load', async () => {
        // Wenn der aktuelle Pfad ein einmaliger Registrierungslink ist: Service Worker NICHT registrieren
        const url = new URL(window.location.href);
        if (url.searchParams.has('tx_srfeuserregister_pi1[regHash]')) {
            console.log("[PWA] Registrierung übersprungen – Einmal-Link erkannt.");
            return;
        }
        if (await shouldRegisterServiceWorker()) {
            try {
                manifest = await loadManifest();

                // Manifest.json laden, um die start_url zu setzen
                const startUrl = manifest.start_url || "/";

                console.log("[PWA] Start-URL aus manifest.json:", startUrl);


            } catch (error) {
                console.error("[PWA] Fehler beim Laden des Manifests:", error);
            }

        }
    });
}

function bindInstallButton() {
    const installBtn = document.getElementById('install-icon');
    if (!installBtn) {
        console.warn("[PWA] install-icon nicht gefunden.");
        return;
    }

    installBtn.style.display = 'block';
    installBtn.onclick = async () => {
        if (!deferredPrompt) {
            console.warn("[PWA] Kein Prompt vorhanden.");
            return;
        }

        console.log("[PWA] Install-Prompt wird angezeigt.");
        deferredPrompt.prompt();

        const choice = await deferredPrompt.userChoice;
        console.log(`[PWA] Antwort: ${choice.outcome}`);

        deferredPrompt = null;
        installBtn.style.display = 'none';
    };
}
// Prüfen, ob der Service Worker registriert werden soll
async function shouldRegisterServiceWorker() {
    return !isPWAInstalled; // Service Worker nur registrieren, wenn die App noch nicht installiert ist
}

// Debugging: Alle relevanten Events ausgeben
["appinstalled", "beforeinstallprompt", "DOMContentLoaded"].forEach(eventName => {
    window.addEventListener(eventName, (event) => {
        console.log(`[PWA] Event: ${eventName}`, event);
    });
});
document.addEventListener("DOMContentLoaded", () => {
    const saveButton = document.getElementById("save-for-offline");
    const statusMessage = document.getElementById("offline-status");
    const cachedPagesList = document.getElementById("cached-pages");

    if ("serviceWorker" in navigator) {
        if(saveButton){
            saveButton.addEventListener("click", async () => {
                if (navigator.serviceWorker.controller) {
                    console.log("[PWA] Seite wird in den Cache gespeichert...");

                    const messageChannel = new MessageChannel();
                    messageChannel.port1.onmessage = (event) => {
                        if (event.data.success) {
                            statusMessage.textContent = "Seite wurde offline gespeichert! ✅";
                            statusMessage.style.color = "green";
                            listCachedPages(); // Liste aktualisieren
                        } else {
                            statusMessage.textContent = "Fehler beim Speichern. ❌";
                            statusMessage.style.color = "red";
                        }
                    };

                    navigator.serviceWorker.controller.postMessage(
                        { action: "cachePage", url: window.location.href },
                        [messageChannel.port2]
                    );
                }
            });
        }

        // Gecachte Seiten abrufen
        async function listCachedPages() {
            if (navigator.serviceWorker.controller) {
                const messageChannel = new MessageChannel();
                messageChannel.port1.onmessage = (event) => {
                    if(cachedPagesList){
                        cachedPagesList.innerHTML = ""; // Liste leeren
                        event.data.pages.forEach((url) => {
                            const li = document.createElement("li");
                            li.innerHTML = `
                            <a href="${url}" target="_blank">${url}</a>
                            <button class="delete-cached-page" data-url="${url}">🗑️ Löschen</button>
                        `;
                            cachedPagesList.appendChild(li);
                        });
                    }

                    // Löschen-Funktion für Buttons
                    document.querySelectorAll(".delete-cached-page").forEach((button) => {
                        button.addEventListener("click", (event) => {
                            const url = event.target.getAttribute("data-url");
                            deleteCachedPage(url);
                        });
                    });
                };

                navigator.serviceWorker.controller.postMessage(
                    { action: "listCachedPages" },
                    [messageChannel.port2]
                );
            }
        }

        // Seite aus Cache löschen
        async function deleteCachedPage(url) {
            if (navigator.serviceWorker.controller) {
                const messageChannel = new MessageChannel();
                messageChannel.port1.onmessage = (event) => {
                    if (event.data.success) {
                        console.log(`[PWA] ${url} wurde aus dem Cache gelöscht.`);
                        listCachedPages(); // Liste aktualisieren
                    } else {
                        console.error(`[PWA] Fehler beim Löschen von ${url}`);
                    }
                };

                navigator.serviceWorker.controller.postMessage(
                    { action: "deletePage", url: url },
                    [messageChannel.port2]
                );
            }
        }

        // Liste beim Laden aktualisieren
        listCachedPages();
    } else {
        console.warn("[PWA] Service Worker wird nicht unterstützt.");
        if(saveButton) saveButton.style.display = "none";
    }
});
