
// bs-gen-co.js

import { updateBsForPoi, detachPoiButtonListeners } from './bs-poi-co.js';
import { updateBsForCluster, detachClusterBsListener } from './bs-cluster-co.js';
import { updateBsForNewAddress } from './bs-newaddress-co.js';

/**
 * Zentraler Koordinator für das Bottom Sheet.
 * Wählt die korrekte Logik basierend auf dem Typ des angeklickten Objekts aus.
 */
export function handleBsUpdate(
    clickedObject,
    bottomSheetUI,
    mapState,
    userLocationInstance,
    getAdminModeStatus,
    markers,
    map,
    backendService,
    // Parameter hinzugefügt
    addButtonUIInstance, 
    updatePoiUIInstance 
) {
    // 1. Alle bestehenden Listener entfernen (Muss am Anfang stehen!)
    // Wir verwenden die Controller-spezifischen Detacher ZUSÄTZLICH
    // zur allgemeinen Klon-Methode, um sicherzustellen, dass keine 
    // komplexen, durch die Controller gesetzten Listener hängen bleiben.
    detachAllBsListeners(bottomSheetUI);
    // Hier können wir optional auch die Detacher der Controller aufrufen, um spezifische 
    // Cleanup-Logik (z.B. Marker-Zustand zurücksetzen) sicherzustellen.
    detachPoiButtonListeners(bottomSheetUI);
    detachClusterBsListener(bottomSheetUI);

    // _displayedObject setzen, damit die Zentrierung auch für spiderfied Marker erfolgt 
    bottomSheetUI.setClickedObject(clickedObject);

    // 2. Prüfen, ob es sich um einen Cluster handelt
    if (clickedObject && clickedObject.getAllChildMarkers) {
        // Es handelt sich um einen Cluster.
        updateBsForCluster(
            clickedObject,
            map,
            bottomSheetUI,
            markers,
            backendService,
            getAdminModeStatus,
            userLocationInstance,
            mapState,   
            addButtonUIInstance, 
            updatePoiUIInstance 
        );
    } else if (clickedObject && clickedObject.options && clickedObject.options.data) {
        // Es handelt sich um einen einzelnen Stolperstein (POI).
        updateBsForPoi(
            clickedObject,
            bottomSheetUI,
            backendService,
            mapState,
            userLocationInstance,
            getAdminModeStatus,
            markers,
            map,
            addButtonUIInstance, 
            updatePoiUIInstance 
        );
    } else if (clickedObject && clickedObject.latlng) {
        // NEUE LOGIK: Klick auf die Karte, um eine neue Adresse zu erstellen.
        updateBsForNewAddress(
            clickedObject, // Das Event-Objekt mit den latlng-Koordinaten.
            bottomSheetUI,
            userLocationInstance,
            getAdminModeStatus,
            map,
            backendService,
            addButtonUIInstance
        );
    } else {
        console.error("Fehler: Ungültiges Objekt für das Bottom Sheet.", clickedObject);
        bottomSheetUI.close();
    }
}
// -------------------------------------------------------------------------
/**
 * Entfernt alle Event-Listener vom Haupt-Aktions-Bereich und anderen interaktiven
 * Elementen des Bottom Sheets, indem die DOM-Knoten geklont werden.
 *
 * Die Controller (bs-poi-co.js, bs-cluster-co.js) MÜSSEN ihre Listener selbst
 * über ihre detach-Funktionen entfernen. Diese Funktion dient als zusätzliche
 * Sicherheitsmaßnahme (Klonen) für alle zentralen Buttons.
 *
 * @param {BsUI} bottomSheetUI Die Instanz des Bottom Sheet UI-Objekts.
 */
function detachAllBsListeners(bottomSheetUI) {
    // --- NEUE SPEZIFISCHE BUTTONS (POI, CLUSTER, FALLBACK) KLONEN UND ERSETZEN ---

    // POI Clean Button
    const poiCleanButton = bottomSheetUI._poiCleanButton;
    if (poiCleanButton) {
        const newPoiCleanButton = poiCleanButton.cloneNode(true);
        poiCleanButton.parentNode.replaceChild(newPoiCleanButton, poiCleanButton);
        bottomSheetUI._poiCleanButton = newPoiCleanButton;
        console.log("DEBUG: POI Clean Button Listener entfernt (durch Klonen).");
    }

    // POI Dirty Button
    const poiDirtyButton = bottomSheetUI._poiDirtyButton;
    if (poiDirtyButton) {
        const newPoiDirtyButton = poiDirtyButton.cloneNode(true);
        poiDirtyButton.parentNode.replaceChild(newPoiDirtyButton, poiDirtyButton);
        bottomSheetUI._poiDirtyButton = newPoiDirtyButton;
        console.log("DEBUG: POI Dirty Button Listener entfernt (durch Klonen).");
    }

    // Cluster Clean Button
    const clusterCleanButton = bottomSheetUI._clusterCleanButton;
    if (clusterCleanButton) {
        const newClusterCleanButton = clusterCleanButton.cloneNode(true);
        clusterCleanButton.parentNode.replaceChild(newClusterCleanButton, clusterCleanButton);
        bottomSheetUI._clusterCleanButton = newClusterCleanButton;
        console.log("DEBUG: Cluster Clean Button Listener entfernt (durch Klonen).");
    }

    // Cluster Dirty Button
    const clusterDirtyButton = bottomSheetUI._clusterDirtyButton;
    if (clusterDirtyButton) {
        const newClusterDirtyButton = clusterDirtyButton.cloneNode(true);
        clusterDirtyButton.parentNode.replaceChild(newClusterDirtyButton, clusterDirtyButton);
        bottomSheetUI._clusterDirtyButton = newClusterDirtyButton;
        console.log("DEBUG: Cluster Dirty Button Listener entfernt (durch Klonen).");
    }
    
    // Fallback Button (identisch für beide Use Cases)
    const fallbackButton = bottomSheetUI._fallbackButton;
    if (fallbackButton) {
        const newFallbackButton = fallbackButton.cloneNode(true);
        fallbackButton.parentNode.replaceChild(newFallbackButton, fallbackButton);
        bottomSheetUI._fallbackButton = newFallbackButton;
        console.log("DEBUG: Fallback Button Listener entfernt (durch Klonen).");
    }

    // Edit Button (bleibt unverändert)
    const editButton = bottomSheetUI.editButton;
    if (editButton) {
        const newEditButton = editButton.cloneNode(true);
        editButton.parentNode.replaceChild(newEditButton, editButton);
        bottomSheetUI.editButton = newEditButton;
        console.log("DEBUG: Edit Button Listener entfernt (durch Klonen).");
    }

    // Caretaker Checkbox (bleibt unverändert)
    const caretakerCheckbox = bottomSheetUI._caretakerCheckbox;
    if (caretakerCheckbox) {
        const newCaretakerCheckbox = caretakerCheckbox.cloneNode(true);
        caretakerCheckbox.parentNode.replaceChild(newCaretakerCheckbox, caretakerCheckbox);
        bottomSheetUI._caretakerCheckbox = newCaretakerCheckbox;
        console.log("DEBUG: Caretaker-Checkbox-Listener entfernt.");
    }
    
    console.log("DEBUG: Alle Bottom-Sheet-Listener entfernt.");
}