// @ts-check

/**
 * @fileoverview map-service.js
 * Zentraler Datenspeicher für Leaflet-Instanzen und zuständig für das
 * Laden der benötigten Core- und Plugin-Ressourcen beim App-Start.
 */

// Live-Binding für die Leaflet-Instanz. Es muss ein exportiertes 'let' sein,
// damit wir es nach dem asynchronen Laden beschreiben können!
/**
 * @type {typeof import('leaflet')|null}
 */
// @ts-ignore
export let L = window.L || null;

/** @type {any} */
let _mapInstance = null;
/** @type {any} */
let _markersInstance = null;
/** @type {Promise<any>|null} */
let loadPromise = null; // Speichert das Lade-Versprechen, um Mehrfachaufrufe abzufangen

/**
 * Lädt alle Leaflet-Skripte und die dazugehörigen CSS-Dateien einmalig.
 * @returns {Promise<any>} Die geladene Leaflet-Instanz (L).
 */
export function loadLeafletResources() {
    // Falls L bereits im Service gesetzt ist, sofort zurückgeben
    if (L && L.markerClusterGroup) return Promise.resolve(L);

    // Falls Leaflet und die Kern-Plugins bereits existieren, direkt auflösen
    if (window.L && window.L.markerClusterGroup && window.L.Routing) {
        L = /** @type {any} */ (window.L);
        return Promise.resolve(L);
    }

    // Falls der Ladevorgang bereits angestoßen wurde, dasselbe Promise zurückgeben
    if (loadPromise) {
        return loadPromise;
    }

    // Hilfsfunktion zum Laden von JavaScript mit Promise-Abdeckung
    const loadJS = (src) => new Promise((resolve, reject) => {
        const s = document.createElement('script');
        s.src = src;
        s.onload = resolve;
        s.onerror = () => reject(new Error(`Fehler beim Laden des Skripts: ${src}`));
        document.head.appendChild(s);
    });

    // Hilfsfunktion zum Laden von CSS-Stylesheets
    const loadCSS = (href) => {
        const l = document.createElement('link');
        l.rel = 'stylesheet';
        l.href = href;
        document.head.appendChild(l);
    };

    // Erstelle die asynchrone Lade-Kette
    loadPromise = (async () => {
        // 1. Alle CSS-Dateien parallel laden (blockieren das JS-Laden nicht)
        loadCSS('https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css');
        loadCSS('https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.2/css/all.min.css');
        loadCSS('https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/MarkerCluster.css');
        loadCSS('https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css');
        loadCSS('https://cdn.jsdelivr.net/npm/leaflet-routing-machine@3.2.12/dist/leaflet-routing-machine.css');

        // 2. Die Hauptbibliothek zwingend zuerst laden (wichtig für window.L)
        await loadJS('https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.js');
        
        // 3. Alle Plugins parallel laden, sobald window.L existiert
        await Promise.all([
            loadJS('https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js'),
            loadJS('https://cdn.jsdelivr.net/npm/leaflet-routing-machine@3.2.12/dist/leaflet-routing-machine.js'),
            loadJS('https://cdn.jsdelivr.net/npm/leaflet-polylinedecorator@1.6.0/dist/leaflet.polylineDecorator.js')
        ]);

        // Lokale Export-Variable mit der globalen Instanz verknüpfen
        L = window.L;
        return L;
    })();

    return loadPromise;
}
/**
 * Globaler Zustand für die Kartenkomponenten.
 * @type {{
 * originalActiveMarkerSize: [number, number],
 * activeMarkerOrCluster: any,
 * activeMarkerOrClusterGID: number|null,
 * parentClusterOfActiveMarker: any,
 * currentlySpiderfiedCluster: any,
 * currentAddressMarker: any,
 * poilessAddressData: any,
 * isRouteActive: boolean
 * }}
 */

export const mapState = {
    originalActiveMarkerSize: [24, 24],
    activeMarkerOrCluster: null,
    activeMarkerOrClusterGID: null,
    parentClusterOfActiveMarker: null,
    currentlySpiderfiedCluster: null,
    currentAddressMarker: null,
    poilessAddressData: null,
    isRouteActive: false
};
window.debugState = mapState; // 'state' ist dein Map-State-Objekt


// --- GETTER & SETTER FÜR DIE INSTANZEN ---

export const getMap = () => _mapInstance;
export const setMap = (instance) => { _mapInstance = instance; };

export const getMarkers = () => _markersInstance;
export const setMarkers = (instance) => { _markersInstance = instance; };