// app.js
import { initMap, map, markers } from './map-manager.js';
import { fetchPOIs, handleCleaningStatusChange, handleCaretakerCheckboxChange } from './poi-data.js';
import { createLocationButton, createAddButton } from './ui-components.js';
import { startTracking, stopTracking, pauseTracking, resumeTracking, userPosition, setLocation, userMarker } from './user-location.js';
import { createTzManager, showToast } from './sc-utilities.js'; // Dein vorhandenes Modul
import { getColorCodeAndText, getMarkerIcon, getPopupContent, is_development } from './popup-utils.js';
import { ScStone } from './ScStone.js'; // Dein vorhandenes ScStone Modul


// Globale Variablen für den Zugriff in den Event-Handlern im HTML-Markup
// Diese müssen im window-Objekt verfügbar sein, wenn sie direkt im HTML-Markup referenziert werden.
window.handleCleanClick = (function() {
    let clickTimeout = null;
    let clickCount = 0;

    return function(gid) {
        clickCount++;

        if (clickCount === 1) {
            clickTimeout = setTimeout(() => {
                handleCleaningStatusChange(gid, false); // Einzelklick
                clickCount = 0;
            }, 300);
        } else if (clickCount === 2) {
            clearTimeout(clickTimeout);
            handleCleaningStatusChange(gid, true); // Doppelklick
            clickCount = 0;
        }
    };
})();

// Temporäre globale Exporte für Zugriff in Popups und anderen HTML-gebundenen Funktionen
// Idealerweise sollte dies in Zukunft vermieden und Event-Listener dynamisch gebunden werden.
window.getColorCodeAndText = getColorCodeAndText;
window.getMarkerIcon = getMarkerIcon;
window.getPopupContent = getPopupContent;
window.is_development = is_development;
window.userPosition = userPosition; // Exponiere userPosition für getPopupContent

// Funktionen, die global verfügbar sein müssen, wenn sie direkt in HTML-Attributen aufgerufen werden
// ACHTUNG: Diese Praxis ist nicht ideal. Besser wäre es, Event-Listener dynamisch zu binden.
window.handleCaretakerCheckboxChange = handleCaretakerCheckboxChange; // WICHTIG: Exposed für Popup
window.tzManager = null; // Wird in DOMContentLoaded initialisiert

document.addEventListener("DOMContentLoaded", function () {
    initMap(); // Karte initialisieren

    // POIs laden und zur Karte hinzufügen
    fetchPOIs();

    // TZ Manager initialisieren
    window.tzManager = createTzManager("#tz", () => {
        showToast("Admin-Modus aktiviert!");
    });


    // Location-Button erstellen und Event-Listener hinzufügen
    if (localStorage.getItem("locationGranted") === "true") {
        const locationButton = createLocationButton();
        document.body.appendChild(locationButton);

        locationButton.addEventListener("click", async () => {
            if (window.watchId) { // window.watchId wird in user-location.js gesetzt
                stopTracking();
                locationButton.classList.remove("clicked");
            } else {
                try {
                    await startTracking(map, setLocation, userMarker); // map, setLocation, userMarker übergeben
                    locationButton.classList.add("clicked");
                } catch (error) {
                    console.error("Fehler beim Abrufen des Standorts:", error);
                }
            }
        });

        // Simuliere den Klick, um den Event-Handler auszulösen, wenn Tracking gewünscht ist
        locationButton.click();

        // Add-Button erstellen und Event-Listener hinzufügen
        const addButton = createAddButton();
        document.body.appendChild(addButton);
        addButton.addEventListener("click", function () {
            const width = window.innerWidth;
            const height = window.innerHeight;
            window.open("validate_address.html", "validateAddressPopup", `width=${width},height=${height},left=0,top=0`);
        });
    } else {
        console.log("locationGranted ist nicht 'true'. Buttons werden nicht gerendert.");
    }

    // Event-Listener für Cluster-Klick, um Tracking zu pausieren
    markers.on("clusterclick", function () {
        pauseTracking(map, userMarker); // map und userMarker übergeben
    });

    // Event-Listener für Klick auf die Karte, um Tracking fortzusetzen
    map.on("click", function () {
        if (localStorage.getItem("locationGranted") === "true") {
            if (window.trackingPaused && window.watchId) { // window.trackingPaused und window.watchId gesetzt in user-location.js
                resumeTracking(map, setLocation, userMarker); // map, setLocation, userMarker übergeben
            }
        }
    });
});

// Event-Listener für das Verlassen der Seite zur Bereinigung
window.addEventListener("beforeunload", function () {
    if (map) {
        map.off();
        if (map && map._layers) {
            for (let layerId in map._layers) {
                let layer = map._layers[layerId];
                if (layer instanceof L.Marker) {
                    map.removeLayer(layer);
                }
            }
        }
        map.remove();
        let mapContainer = document.getElementById("map");
        if (mapContainer) {
            mapContainer.innerHTML = "";
        }
    }
    sessionStorage.clear();
});

// Diese Funktionen werden hier nur zur Vollständigkeit der Modularisierung aufgeführt,
// sie sind Teil des ursprünglichen "stolperclean.js" und nicht direkt Teil der app.js
// Ihr ursprünglicher Aufruf in index.html ist nicht betroffen.
// function checkStoredData() { /* ... */ }
// function saveData() { /* ... */ }
// function showAlert(message) { /* ... */ }
// function checkLocationPermission() { /* ... */ }