/**
 * Singleton-Klasse für die Verwaltung und Koordination des Admin-Modus-Status.
 */
export class AdminModeCoordinator {
    static #instance = null;

    /** @private {string} #STORAGE_KEY - Der Schlüssel für den LocalStorage. */
    #STORAGE_KEY = 'sc_admin_mode_active';

    /** @private {boolean} #adminModeActive - Speichert den aktuellen Status intern. */
    #adminModeActive = false; 
    
    /** @private {Array<function(boolean): void>} #statusChangeListeners - Listener für UI-Änderungen. */
    #statusChangeListeners = []; 

    constructor() {
        if (AdminModeCoordinator.#instance) {
            throw new Error("Verwenden Sie AdminModeCoordinator.getInstance() für den Zugriff.");
        }
        // Beim Instanziieren den gespeicherten Status laden
        this.#loadFromStorage();
    }

    static getInstance() {
        if (!AdminModeCoordinator.#instance) {
            AdminModeCoordinator.#instance = new AdminModeCoordinator();
        }
        return AdminModeCoordinator.#instance;
    }
    
    /**
     * Lädt den Status aus dem LocalStorage beim Initialisieren.
     * @private
     */
    #loadFromStorage() {
        const savedStatus = localStorage.getItem(this.#STORAGE_KEY);
        // Da localStorage nur Strings speichert, prüfen wir auf den String 'true'
        this.#adminModeActive = (savedStatus === 'true');
        console.debug(`AdminModeCoordinator: Status aus Storage geladen: ${this.#adminModeActive}`);
    }

    /**
     * Ruft den aktuellen Admin-Modus-Status ab.
     * @returns {boolean} True, wenn Admin-Modus aktiv ist, sonst false.
     */
    getStatus = () => {
        return this.#adminModeActive;
    }
    
    /**
     * Aktualisiert den Status, speichert ihn im LocalStorage und benachrichtigt die UI.
     * @param {boolean} newState - Der neue Status.
     */
    dispatchStatusChange(newState) {
        // 1. Internen Status aktualisieren
        this.#adminModeActive = newState; 
        
        // 2. Im LocalStorage persistieren
        localStorage.setItem(this.#STORAGE_KEY, newState.toString());

        // 3. Listener benachrichtigen
        this.#statusChangeListeners.forEach(callback => {
            try {
                callback(newState);
            } catch (e) {
                console.error("Fehler im AdminMode Status Change Listener:", e);
            }
        });
        console.debug(`AdminModeCoordinator: Status geändert & gespeichert: ${newState}`);
    }

    /**
     * Ermöglicht UI-Komponenten, auf Änderungen zu reagieren.
     * @param {function(boolean): void} callback 
     */
    onStatusChange(callback) {
        if (typeof callback === 'function') {
            this.#statusChangeListeners.push(callback);
        }
    }
}

export const getAdminMode = AdminModeCoordinator.getInstance();