import { mylog } from "./sc-utilities.js"; 
import { renderAddressSheetResults } from "./addrs-ui-render-results.js"; 

const STATE_INPUT_ONLY = 'input-only';
const STATE_RESULTS_OPEN = 'results-open';

/**
 * Managt die Benutzeroberfläche für die Adresssuche (Eingabefeld, Schließen-Button, Ergebnis-Sheet).
 * Diese Klasse ist für das DOM-Management zuständig und informiert andere Module über Benutzerinteraktionen
 * mittels Callbacks. Sie führt KEINE Kartenoperationen oder AJAX-Anfragen selbst aus.
 * * Diese Version ist vollständig entkoppelt vom externen Trigger-Element.
 */
export class AddressSheetUI {
    
    // --- CALLBACK ARRAYS (searchEnteredAddressCallbacks ENTFERNT) ---
    searchInputCallbacks = [];
    guiLocationRequestedCallbacks = [];
    currentLocationSelectedCallbacks = [];
    
    
    /**
     * Konstruktor für addressSheetUI.
     * Injiziert automatisch HTML und CSS und initialisiert Event-Listener.
     */
    constructor() {
        mylog("Address Sheet UI: Konstruktor gestartet.");
        
        // HTML-Template für das Adress-Sheet
        this.panelHTML = `
            <div id="address-input-container" class="hidden"> 
                <div id="address-input-header">
                    <input type="text" id="address-search-input" placeholder="Adresse eingeben..." />
                    <button id="address-search-close-button" class="hidden">
                        <i class="fas fa-times"></i>
                    </button>
                </div>
                <div id="address-results-sheet" class="hidden">
                    <ul class="sc-address-results-list">
                        <li id="current-location-item" class="sc-address-result-item" data-type="current-location">
                            <div class="sc-address-result-icon"><i class="fas fa-location-crosshairs"></i></div>
                            <div class="sc-address-result-text">
                                <div id="current-location-display-text" class="sc-address-result-line">Standortfreigabe deaktiviert</div>
                            </div>
                        </li>
                        <p style="text-align: center; color: #888; padding: 20px;">Beginne mit der Eingabe einer Adresse...</p>
                    </ul>
                </div>
            </div>
        `;

        // CSS-Styles für das Adress-Sheet (unverändert)
        this.panelCSS = `
            /* NEUE STYLES FÜR ADRESSSUCHE */
            #address-input-container {
                position: fixed; /* 🛑 KORREKTUR: FIXED statt absolute, um im Viewport zu bleiben */
                top: 20px;
                left: 50%;
                transform: translateX(-50%);
                width: 50%;
                max-width: 500px;
                background-color: #fff;
                border-radius: 25px;
                box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
                z-index: 1000;
                transition: all 0.3s ease-in-out;
                overflow: hidden;
                display: flex;
                flex-direction: column;
            }

            #address-input-container.fullscreen-mode {
                top: 0; /* 🛑 KORREKTUR: top: 0 statt top: 20 */
                left: 0;
                width: 100%;
                height: 100dvh; /* Verwenden Sie dvh für eine bessere mobile Ansicht */
                max-width: none;
                border-radius: 0;
                transform: translateX(0);
                background-color: white;
                z-index: 10002;
            }
            
            /* ... (Restliche CSS-Styles unverändert) ... */
            
            #address-input-header {
                display: flex;
                align-items: center;
                padding: 5px;
                height: 50px;
                box-sizing: border-box;
                background-color: #fff;
                z-index: 2;
                position: relative;
                width: 100%;
            }

            #address-input-header.active {
                border-bottom: 1px solid #eee;
            }

            #address-search-input {
                flex-grow: 1;
                padding: 10px 15px;
                border: none;
                border-radius: 25px;
                font-size: 1em;
                outline: none;
                box-shadow: none;
                background: transparent;
                margin: 0;
            }

            #address-search-close-button {
                background-color: #f44336;
                color: white;
                border: none;
                border-radius: 50%;
                width: 35px;
                height: 35px;
                display: flex;
                justify-content: center;
                align-items: center;
                font-size: 20px;
                cursor: pointer;
                box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
                margin-left: 10px;
            }

            #address-search-close-button:hover {
                background-color: #d32f2f;
            }

            #address-results-sheet {
                flex-grow: 1;
                background-color: white;
                overflow-y: auto;
                padding: 0;
                box-shadow: none;
                /* max-height: calc(100vh - 50px); */ /* Im Vollbildmodus nicht nötig */
            }

            .sc-address-results-list {
                padding: 0;
                margin: 0;
                list-style: none;
            }

            .sc-address-result-item {
                display: flex;
                align-items: center;
                padding: 12px 15px;
                border-top: 1px solid #eee;
                cursor: pointer;
                transition: background-color 0.2s ease, opacity 0.2s ease, color 0.2s ease;
            }

            .sc-address-result-item:first-child {
                border-top: none;
            }

            .sc-address-result-item:hover:not(.disabled-location) {
                background-color: #f0f0f0;
            }

            .sc-address-result-icon {
                font-size: 1.2em;
                color: #555;
                margin-right: 10px;
                width: 25px;
                text-align: center;
            }

            .sc-address-result-text {
                flex-grow: 1;
            }

            .sc-address-result-text .sc-address-result-line {
                font-weight: normal;
                color: #333;
                font-size: 1em;
            }

            .sc-address-result-item.enabled-location {
                background-color: #e6f7ff;
            }

            .sc-address-result-item.enabled-location .sc-address-result-icon {
                color: #007bff;
            }

            .sc-address-result-item.enabled-location .sc-address-result-text .sc-address-result-line {
                color: #007bff;
                font-weight: bold;
            }

            .sc-address-result-item.disabled-location {
                cursor: not-allowed;
                opacity: 0.6;
            }

            .sc-address-result-item.disabled-location .sc-address-result-icon {
                color: #888;
            }

            .sc-address-result-item.disabled-location .sc-address-result-text .sc-address-result-line {
                color: #888;
                font-style: italic;
            }
        `;

        // 1. CSS des Adress Sheets in den Head des Dokuments injizieren
        this._injectCSS();

        // 2. HTML des Adress Sheets in den Body des Dokuments injizieren
        this._injectHTML();

        // 3. Jetzt, da HTML und CSS im DOM sind, können wir die Elemente abrufen
        this.addressInputContainer = document.getElementById('address-input-container');
        this.addressSearchInput = document.getElementById('address-search-input');
        this.addressResultsSheet = document.getElementById('address-results-sheet');
        this.addressSearchCloseButton = document.getElementById('address-search-close-button');
        this.addressInputHeader = this.addressSearchInput.closest('#address-input-header');
        this.addressResultsList = this.addressResultsSheet.querySelector('.sc-address-results-list');
        this.currentLocationDisplayTextElement = document.getElementById('current-location-display-text');
        this.currentLocationItem = document.getElementById('current-location-item');
        // ❌ this.searchEnteredAddressItem = document.getElementById('search-entered-address-item'); // ENTFERNT
        
        if (!this.addressInputContainer) {
            console.error("Fehler: Kritisches Element für das Adress-Sheet (Container) nicht gefunden.");
        }

        // Initialer Zustand des Sheets: versteckt
        this._currentState = STATE_INPUT_ONLY;
        
        // Zustand SOFORT anwenden, um sicherzustellen, dass das Sheet initial verborgen ist
        this._applyState(); 

        this._addEventListeners();

        // Initialisieren der Buttons
        this.updateCurrentLocationButton(false);
        // ❌ this.updateSearchEnteredAddressButtonState(); // ENTFERNT
        mylog("Address Sheet UI: Initialisierung abgeschlossen.");
    }

    /**
     * Injiziert die CSS-Styles in den <head> des Dokuments.
     * @private
     */
    _injectCSS() {
        if (!document.getElementById('sc-address-sheet-styles')) {
            const style = document.createElement('style');
            style.id = 'sc-address-sheet-styles';
            style.textContent = this.panelCSS;
            document.head.appendChild(style);
        }
    }

    /**
     * Injiziert das HTML-Template in den Body des Dokuments.
     * @private
     */
    _injectHTML() {
        if (!document.getElementById('address-input-container')) {
            document.body.insertAdjacentHTML('beforeend', this.panelHTML);
        }
    }

    /**
     * Fügt Event-Listener zu den UI-Elementen hinzu.
     * @private
     */
    _addEventListeners() {
        // ... (Ihre Event Listener) ...

        this.addressSearchInput.addEventListener('focus', () => {
            this.setInitialResultsContent();
            // ❌ this.updateSearchEnteredAddressButtonState(); // ENTFERNT
        });

        this.addressSearchInput.addEventListener('input', () => {
            const query = this.addressSearchInput.value.trim();
            this.searchInputCallbacks.forEach(cb => cb(query));
            // ❌ this.updateSearchEnteredAddressButtonState(); // ENTFERNT
        });

        this.addressSearchCloseButton.addEventListener('click', () => {
            this.closeResults();
        });

        this.addressResultsList.addEventListener('click', (event) => {
            const listItem = event.target.closest('.sc-address-result-item');
            if (listItem) {
                if (listItem.dataset.type === 'current-location' && listItem.style.pointerEvents !== 'none') {
                    this.currentLocationSelectedCallbacks.forEach(cb => cb());
                    this.closeResults();
                // ❌ LOGIK FÜR search-entered-address WURDE ENTFERNT
                } else if (listItem.dataset.type !== 'current-location') { // ❌ ÄNDERUNG: Prüfung auf 'search-entered-address' entfernt
                    const lat = parseFloat(listItem.dataset.lat);
                    const lon = parseFloat(listItem.dataset.lon);
                    const street  = listItem.dataset.street;
                    const houseNr = listItem.dataset.houseNr;
                    const textToDisplay = listItem.dataset.textToDisplay;
                    const source = listItem.dataset.source;
                    const gid = listItem.dataset.gid;

                    if (!isNaN(lat) && !isNaN(lon)) {
                        this.guiLocationRequestedCallbacks.forEach(cb => cb({ lat, lon, street, houseNr,displayName: textToDisplay, source: source, gid: gid }));
                        this.closeResults();
                    }
                }
            }
        });

        // Event-Listener für Klicks außerhalb des Sheets zum Schließen
        document.addEventListener('click', (event) => {
            // Nur wenn das Sheet geöffnet ist UND der Klick NICHT innerhalb des Containers war
            if (this.isOpen() &&
                !this.addressInputContainer.contains(event.target)) {
                
                // Wir müssen den externen Trigger ignorieren, damit das Sheet nicht schließt,
                // wenn der Klick zum Öffnen von dort kommt (was aber eigentlich durch die
                // closeResults() im index.html click-Handler verhindert werden sollte).
                const isTrigger = event.target.closest('#search-address-trigger');
                
                if (!isTrigger) {
                    this.closeResults();
                    mylog("DEBUG: Adress Sheet geschlossen durch Klick außerhalb.");
                }
            }
        });
    }

    /**
     * Wendet die CSS-Klassen basierend auf dem aktuellen Zustand an.
     * @private
     */
    _applyState() {
        if (this._currentState === STATE_INPUT_ONLY) {
            // Stellen Sie sicher, dass der Haupt-Container VERSTECKT ist
            this.addressInputContainer.classList.add('hidden');
            this.addressResultsSheet.classList.add('hidden');
            this.addressSearchCloseButton.classList.add('hidden');

            if (this.addressInputHeader) {
                this.addressInputHeader.classList.remove('active');
            }

            this.addressInputContainer.classList.remove('fullscreen-mode');
            
        } else if (this._currentState === STATE_RESULTS_OPEN) {
            // Stellen Sie sicher, dass der Haupt-Container SICHTBAR ist
            this.addressInputContainer.classList.remove('hidden');
            this.addressResultsSheet.classList.remove('hidden');
            this.addressSearchCloseButton.classList.remove('hidden');

            if (this.addressInputHeader) {
                this.addressInputHeader.classList.add('active');
            }

            this.addressInputContainer.classList.add('fullscreen-mode');
            this.addressSearchInput.focus();
        }
        
        // 🛑 stateChangeCallbacks.forEach(cb => cb(this._currentState)); WURDE ENTFERNT
    }

    /**
     * Öffnet das Adress-Such-Ergebnis-Sheet.
     */
    openResults() {
        if (this._currentState !== STATE_RESULTS_OPEN) {
            this._currentState = STATE_RESULTS_OPEN;
            this.addressSearchInput.value = ''; // Eingabefeld leeren, wenn Sheet geöffnet wird
            this.setInitialResultsContent();
            // ❌ this.updateSearchEnteredAddressButtonState(); // ENTFERNT
            this._applyState(); // Zustand anwenden MUSS nach der Vorbereitung erfolgen
            mylog("DEBUG: Adress-Suchsheet geöffnet.");
        }
    }

    /**
     * Schließt das Adress-Such-Ergebnis-Sheet und leert die Inhalte.
     */
    closeResults() {
        if (this._currentState !== STATE_INPUT_ONLY) {
            this._currentState = STATE_INPUT_ONLY;
            this.addressSearchInput.value = '';
            this.setInitialResultsContent();
            // ❌ this.updateSearchEnteredAddressButtonState(); // ENTFERNT
            this._applyState(); // Zustand anwenden MUSS nach der Vorbereitung erfolgen
            mylog("DEBUG: Adress-Suchsheet geschlossen.");
        }
    }

    /**
     * Setzt den initialen Inhalt der Ergebnisliste.
     */
    setInitialResultsContent() {
        // ❌ ÄNDERUNG: Nur das erste Element (Current-Location) beibehalten.
        // Entfernen Sie alle Elemente nach dem ersten (Standort)
        while (this.addressResultsList.children.length > 1) {
            this.addressResultsList.removeChild(this.addressResultsList.lastChild);
        }

        const hasPlaceholderText = this.addressResultsList.querySelector('p');
        
        // Fügt Platzhaltertext hinzu, wenn die Eingabe leer ist und der Text fehlt
        if (this.addressSearchInput.value.trim() === '' && !hasPlaceholderText) {
            const textLi = document.createElement('li');
            textLi.innerHTML = '<p style="text-align: center; color: #888; padding: 20px;">Beginne mit der Eingabe einer Adresse...</p>';
            this.addressResultsList.appendChild(textLi);
        } 
        // Entfernt Platzhaltertext, wenn die Eingabe nicht leer ist und der Text existiert
        else if (this.addressSearchInput.value.trim() !== '' && hasPlaceholderText) {
            // Entfernt das p-Element, das in einem li-Element enthalten ist
            const parentLi = hasPlaceholderText.closest('li');
            if (parentLi) {
                this.addressResultsList.removeChild(parentLi);
            }
        }
        // ❌ this.updateSearchEnteredAddressButtonState(); // ENTFERNT
    }


    // ... (Ihre Callback-Registrierungen) ...
    onSearchInput(callback) {
        if (typeof callback === 'function') {
            this.searchInputCallbacks.push(callback);
        }
    }

    searchResultSelected(callback) {
        if (typeof callback === 'function') {
            this.guiLocationRequestedCallbacks.push(callback);
        }
    }

    // 🛑 onStateChange(callback) WURDE ENTFERNT

    onCurrentLocationSelected(callback) {
        if (typeof callback === 'function') {
            this.currentLocationSelectedCallbacks.push(callback);
        }
    }

    // ❌ onSearchEnteredAddress(callback) WURDE ENTFERNT
    /*
    onSearchEnteredAddress(callback) {
        if (typeof callback === 'function') {
            this.searchEnteredAddressCallbacks.push(callback);
        }
    }
    */

    /**
     * Gibt den aktuellen Wert des Adress-Eingabefeldes zurück.
     */
    getInputValue() {
        return this.addressSearchInput.value;
    }

    /**
     * Prüft, ob das Ergebnis-Sheet aktuell geöffnet ist.
     */
    isOpen() {
        return this._currentState === STATE_RESULTS_OPEN;
    }


    /**
     * Rendert eine Liste von Adressergebnissen im Sheet.
     */
    renderResults(data)
    {
        renderAddressSheetResults(this.addressResultsList, this.addressSearchInput, data);
    }

    /**
     * Aktualisiert den Text und/oder das visuelle Erscheinungsbild des "Aktueller Standort" Eintrags.
     */
    updateCurrentLocationButton(isEnabled) {
        if (this.currentLocationDisplayTextElement && this.currentLocationItem) {
            if (isEnabled) {
                this.currentLocationDisplayTextElement.textContent = 'Zum aktuellen Standort';
                this.currentLocationItem.classList.add('enabled-location');
                this.currentLocationItem.classList.remove('disabled-location');
                this.currentLocationItem.style.opacity = '1';
                this.currentLocationItem.style.pointerEvents = 'auto';
                this.currentLocationItem.setAttribute('aria-disabled', 'false');
            } else {
                this.currentLocationDisplayTextElement.textContent = 'Standortfreigabe deaktiviert';
                this.currentLocationItem.classList.add('disabled-location');
                this.currentLocationItem.classList.remove('enabled-location');
                this.currentLocationItem.style.opacity = '0.5';
                this.currentLocationItem.style.pointerEvents = 'none';
                this.currentLocationItem.setAttribute('aria-disabled', 'true');
            }
            mylog(`Address Sheet UI: Current location button state updated to isEnabled=${isEnabled}`);
        }
    }

    // ❌ updateSearchEnteredAddressButtonState() WURDE ENTFERNT
    /*
    updateSearchEnteredAddressButtonState() {
        if (this.searchEnteredAddressItem) {
            const query = this.addressSearchInput.value.trim();
            const shouldBeEnabled = this.isOpen() && query.length > 5;

            if (shouldBeEnabled) {
                this.searchEnteredAddressItem.style.opacity = '1';
                this.searchEnteredAddressItem.style.pointerEvents = 'auto';
                this.searchEnteredAddressItem.setAttribute('aria-disabled', 'false');
                this.searchEnteredAddressItem.classList.add('enabled-location');
                this.searchEnteredAddressItem.classList.remove('disabled-location');
            } else {
                this.searchEnteredAddressItem.style.opacity = '0.5';
                this.searchEnteredAddressItem.style.pointerEvents = 'none';
                this.searchEnteredAddressItem.setAttribute('aria-disabled', 'true');
                this.searchEnteredAddressItem.classList.add('disabled-location');
                this.searchEnteredAddressItem.classList.remove('enabled-location');
            }
        }
    }
    */

    /**
     * Prüft, ob ein gegebenes DOM-Element innerhalb des Haupt-DOM-Elements dieses Address Sheets liegt.
     */
    contains(target) {
        if (!this.addressInputContainer) {
            console.warn("addressSheetUI: Haupt-DOM-Element 'addressInputContainer' ist nicht initialisiert. 'contains'-Prüfung nicht möglich.");
            return false;
        }
        return this.addressInputContainer.contains(target);
    }
}