// poi-data.js
import { getMarkers, map } from './map-manager.js';
import { getColorCodeAndText, getMarkerIcon, getPopupContent } from './popup-utils.js';
import { ScStone } from './ScStone.js'; // Importiere dein ScStone Modul


export function fetchPOIs() {
    const markers = getMarkers(); // Hole die markers Instanz vom map-manager

    fetch("./fetch_pois.php")
        .then((response) => {
            if (!response.ok) {
                throw new Error(`Fehler: ${response.statusText}`);
            }
            return response.json();
        })
        .then((data) => {
            if (data.features) {
                data.features.forEach((feature) => {
                    const props = feature.properties;
                    const coords = feature.geometry.coordinates;

                    let colorCode = "gray";
                    if (props.last_cleaned) {
                        colorCode = getColorCodeAndText(props.last_cleaned).colorCode;
                    }

                    const iconHtml = getMarkerIcon(props.caretaker, colorCode);

                    const marker = L.marker([coords[1], coords[0]], {
                        icon: L.divIcon({
                            className: "poi-icon " + colorCode,
                            html: iconHtml,
                            iconSize: [24, 24],
                        }),
                        data: props,
                    });

                    const popup = L.popup();
                    marker.bindPopup(popup);

                    marker.on("popupopen", function () {
                        // Da getPopupContent nun von `utils.js` importiert wird und
                        // `userPosition` global im `window` Objekt verfügbar gemacht wurde (temporär),
                        // sollte es hier funktionieren. Besser wäre es, userPosition direkt zu übergeben.
                        popup.setContent(getPopupContent(marker));

                        const checkbox = document.getElementById("caretaker-checkbox");
                        if (checkbox) {
                            checkbox.addEventListener("change", function () {
                                const isChecked = checkbox.checked;
                                handleCaretakerCheckboxChange(
                                    marker.options.data.gid,
                                    isChecked,
                                    marker
                                );
                            });
                        }
                    });
                    markers.addLayer(marker);
                });
                // map.addLayer(markers); // Bereits im map-manager initMap hinzugefügt
            } else {
                console.error("Keine POIs gefunden");
            }
        })
        .catch((error) => {
            console.error("Fehler beim Abrufen der POIs:", error.message);
        });
}

export function UpdateMarkerIcon(poiId, lastCleaned) {
    const markers = getMarkers();
    const marker = markers.getLayers().find((m) => m.options.data.gid === poiId);

    if (marker) {
        marker.options.data.needs_cleaning = false;
        marker.options.data.last_cleaned = lastCleaned;

        const { colorCode } = getColorCodeAndText(lastCleaned);
        const iconHtml = getMarkerIcon(marker.options.data.caretaker, colorCode);

        marker.setIcon(
            L.divIcon({
                html: iconHtml,
                className: "custom-icon",
                iconSize: [30, 30],
            })
        );

        markers.refreshClusters();
        marker.closePopup();
    } else {
        console.error(`Kein Marker mit der GID ${poiId} gefunden.`);
    }
}

export function handleCleaningStatusChange(poiId, isDirty) {
    const username = localStorage.getItem("username");
    if (!username) {
        alert("Kein Benutzername gefunden.");
        return;
    }

    const tzManager = window.tzManager; // Zugriff auf den globalen tzManager

    if (isDirty && !tzManager.isAdmin()) {
        alert("Nur Admins dürfen als 'schmutzig' markieren.");
        return;
    }

    const stone = new ScStone({ gid: poiId });

    stone.updateCleaningStatus(isDirty)
        .then((result) => {
            UpdateMarkerIcon(poiId, result.last_cleaned);
        })
        .catch((error) => {
            console.error("Fehler beim Aktualisieren des Status:", error);
            alert("Der Status konnte nicht aktualisiert werden.");
        });
}


export function handleCaretakerCheckboxChange(poiId, isChecked, marker) {
    const username = localStorage.getItem("username");

    if (!username) {
        console.error("Kein Benutzername vorhanden");
        return;
    }

    const data = {
        gid: poiId,
        caretaker: isChecked ? "anonym" : "",
    };

    fetch("update_poi_caretaker.php", {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
        },
        body: JSON.stringify(data),
    })
        .then((response) => response.json())
        .then((result) => {
            if (result.success) {
                console.log("Caretaker erfolgreich aktualisiert.");
                const colorCode = getColorCodeAndText(
                    marker.options.data.last_cleaned
                ).colorCode;
                const iconHtml = getMarkerIcon(
                    isChecked ? "anonym" : "",
                    colorCode
                );

                marker.setIcon(
                    L.divIcon({
                        html: iconHtml,
                        className: "custom-icon",
                        iconSize: [30, 30],
                    })
                );
                marker.options.data.caretaker = isChecked ? "anonym" : "";
            } else {
                console.error(
                    "Fehler beim Aktualisieren des Caretakers:",
                    result.error
                );
            }
        })
        .catch((error) => {
            console.error("Fehler beim Senden der Anfrage:", error);
        });
}