import { mylog } from './utilities.js';
// Bezug über Service
import { getMap } from './map-service.js';
import { BackendService } from './backend-db.js';

/**
 * AppShellCoordinator.js
 * Verwaltet die Events des statischen App-Shell-UI und leitet diese weiter.
 * Steuert die Sichtbarkeit globaler Elemente (Karte, Spinner, Controls).
 * @typedef {import('./app-shell-ui.js').AppShellUI} AppShellUI
 */
export class AppShellCoordinator {
    /** @type {AppShellUI} */
    #appShellUI;

    // Callbacks für den ApplicationCoordinator
    #onSearchTriggeredCallback = () => { };
    #onSettingsClickedCallback = () => { };
    #onAdminTriggeredCallback = () => { };


    /**
     * @param {AppShellUI} appShellUI - Die UI-Instanz, deren Events dieser Coordinator verwaltet.
     */
    constructor(appShellUI) {
        this.#appShellUI = appShellUI;
        this.#setupEventListeners();
        mylog("AppShellCoordinator: Initialisiert.");
    }


    /**
     * Richtet die globalen Event-Listener für die UI-Elemente ein.
     * @private
     */
    #setupEventListeners() {
        // 1. Suche-Trigger
        if (this.#appShellUI.searchTriggerElement) {
            this.#appShellUI.searchTriggerElement.addEventListener('click', () => {
                mylog("AppShellCoordinator: Search-Trigger geklickt.");
                this.#onSearchTriggeredCallback();
            });
        }

        // 2. Settings-Icon
        if (this.#appShellUI.settingsIconElement) {
            this.#appShellUI.settingsIconElement.addEventListener('click', (event) => {
                event.stopPropagation();
                mylog("AppShellCoordinator: Settings-Icon geklickt.");
                this.#onSettingsClickedCallback();
            });
        }

        window.addEventListener('sc-auth-changed', (event) => {
            const isLoggedIn = (event.detail?.status === 'user');
            // Sofort das Icon umschalten!
            this.#appShellUI.updateLoginStatus(isLoggedIn);
            // Optional: Trotzdem einmal im Hintergrund syncen
            this.syncSettingsIconWithSession();
        });
    }

    // ===============================================
    // 📢 PUBLISHER METHODEN
    // ===============================================

    onSearchTriggered(callback) {
        this.#onSearchTriggeredCallback = callback;
    }

    onSettingsClicked(callback) {
        this.#onSettingsClickedCallback = callback;
    }


    // ===============================================
    // ⚙️ STEUERUNGS-METHODEN
    // ===============================================

    /**
     * Macht die Karte und die globalen Steuerelemente sichtbar.
     */
    showMapAndControls() {
        if (this.#appShellUI.mapElement) {
            this.#appShellUI.mapElement.classList.remove('hidden');
        }
        if (this.#appShellUI.settingsIconElement) {
            this.#appShellUI.settingsIconElement.classList.remove('hidden');
        }
        if (this.#appShellUI.searchTriggerElement) {
            this.#appShellUI.searchTriggerElement.classList.remove('hidden');
        }
        // 2. DIE AURA SYNCHRONISIEREN
        // Wir rufen es hier auf, weil das Icon JETZT im DOM existiert und angezeigt wird.
        this.syncSettingsIconWithSession();

        // 💡 Minimalinvasive Anpassung: Map wird hier lokal via Service geholt
        const map = getMap();
        if (map) {
            setTimeout(() => {
                map.invalidateSize();
                mylog("AppShellCoordinator: Leaflet Map Größe neu validiert (invalidateSize).");
            }, 10);
        }

        mylog("AppShellCoordinator: Karte und Steuerelemente eingeblendet.");
    }

    /**
     * Macht den Lade-Spinner sichtbar.
     */
    showLoadingSpinner() {
        const spinner = document.getElementById('loading-spinner-content');
        if (spinner) {
            spinner.classList.remove('hidden');
            spinner.classList.remove('fade-out');
        }
    }

    /**
     * Blendet den Lade-Spinner aus (mit Transition).
     */
    hideLoadingSpinner() {
        const spinner = document.getElementById('loading-spinner-content');
        if (spinner) {
            spinner.classList.add('fade-out');
        }
    }

    /**
     * Aktualisiert den Text unter dem Lade-Spinner.
     * @param {string} text - Der anzuzeigende Text.
     */
    updateLoadingText(text) {
        const textElement = document.getElementById('estimated-time-display');
        if (textElement) {
            textElement.textContent = text;
        }
    }

    /**
     * Macht das Overlay zur Standort-Erlaubnis sichtbar.
     */
    showLocationPermissionOverlay() {
        const overlay = document.getElementById('location-permission-overlay');
        if (overlay) {
            overlay.classList.remove('hidden');
            overlay.style.opacity = 1;
            overlay.style.pointerEvents = 'auto';
        }
    }

    /**
     * Blendet das Overlay zur Standort-Erlaubnis aus.
     */
    hideLocationPermissionOverlay() {
        const overlay = document.getElementById('location-permission-overlay');
        if (overlay) {
            overlay.classList.add('hidden');
            overlay.style.pointerEvents = 'none';
        }
    }



    /**
* Synchronisiert das Icon-Design direkt mit der Server-Session.
*/
    async syncSettingsIconWithSession() {
        try {
            const backend = BackendService.getInstance();
            const session = await backend.checkSession();

            // Prüfen: Haben wir einen echten User (nicht Gast/null)?
            const isLoggedIn = session.success && session.username && session.username !== 'Gast';

            this.#appShellUI.updateLoginStatus(isLoggedIn);

            console.log(`[AppShell] Icon-Sync: ${isLoggedIn ? 'Aura GRÜN (User: ' + session.username + ')' : 'Aura TRANSPARENT'}`);
        } catch (e) {
            console.error("[AppShell] Fehler beim Session-Sync für Icon:", e);
            this.updateLoginStatus(false);
        }
    }
}

