// admin-mode-co.js

/**
 * Singleton-Klasse für die Verwaltung und Koordination des Admin-Modus-Status.
 * * Verantwortlichkeiten:
 * 1. Speichert die zentrale Status-Getter-Funktion (vom ApplicationCoordinator).
 * 2. Stellt den Status allen Modulen über getStatus() zur Verfügung.
 * 3. Verwaltet Listener, um UI-Komponenten (Shell) bei Statusänderungen zu benachrichtigen (Dispatcher-Muster).
 */
class AdminModeCoordinator {
    /** @private {AdminModeCoordinator|null} */
    static #instance = null;

    /** @private {function(): boolean} #statusGetter - Hält die Funktion, die den Status abruft. */
    #statusGetter = () => false; 
    
    /** @private {Array<function(boolean): void>} #statusChangeListeners - Listener für UI-Änderungen. */
    #statusChangeListeners = []; 

    /**
     * Privater Konstruktor, um die Instanziierung von außen zu verhindern.
     */
    constructor() {
        if (AdminModeCoordinator.#instance) {
            throw new Error("Verwenden Sie AdminModeCoordinator.getInstance() für den Zugriff.");
        }
    }

    /**
     * Gibt die Singleton-Instanz zurück.
     * @returns {AdminModeCoordinator} Die Singleton-Instanz.
     */
    static getInstance() {
        if (!AdminModeCoordinator.#instance) {
            AdminModeCoordinator.#instance = new AdminModeCoordinator();
        }
        return AdminModeCoordinator.#instance;
    }
    
    // --- Koordination/Verwaltung des Status ---

    /**
     * Ruft den aktuellen Admin-Modus-Status ab (für alle Konsumenten).
     * @returns {boolean} True, wenn Admin-Modus aktiv ist, sonst false.
     */
    // 🛑 KORREKTUR des TypeError: 
    // Als Arrow Function Property definiert, um den 'this'-Kontext korrekt an die Instanz zu binden.
    getStatus = () => {
        return this.#statusGetter();
    }

    /**
     * Setzt die Getter-Funktion, die den Status vom ApplicationCoordinator abruft.
     * @param {function(): boolean} getterFunc - Die Funktion des Coordinators, die den Status hält.
     */
    setGetter(getterFunc) {
        this.#statusGetter = getterFunc;
    }
    
    // --- Dispatcher/Observer Muster für die UI (Shell-Feature) ---

    /**
     * Benachrichtigt alle Abonnenten (z.B. das Shell-UI-Feature) über den Statuswechsel.
     * @param {boolean} newState - Der neue Status.
     */
    dispatchStatusChange(newState) {
        this.#statusChangeListeners.forEach(callback => {
            try {
                callback(newState);
            } catch (e) {
                console.error("Fehler beim Ausführen des AdminMode Status Change Listeners:", e);
            }
        });
        console.debug(`AdminModeCoordinator: Statusänderung verteilt: ${newState}`);
    }

    /**
     * Ermöglicht UI-Komponenten, auf Änderungen im Admin-Modus zu reagieren.
     * @param {function(boolean): void} callback - Funktion, die den neuen Status erhält.
     */
    onStatusChange(callback) {
        if (typeof callback === 'function') {
            this.#statusChangeListeners.push(callback);
        }
    }
}

/**
 * Export der Singleton-Instanz als einzige öffentliche Schnittstelle.
 * Ermöglicht den direkten Zugriff: getAdminMode.getStatus()
 */
export const getAdminMode = AdminModeCoordinator.getInstance();