// 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,
    backendService,
    addButtonUIInstance, 
    updatePoiUIInstance 
) {
    console.log("DEBUG: handleBsUpdate aufgerufen. Starte Bottom Sheet Update Logik.");
    
    // 1. Alle bestehenden Listener entfernen
    detachAllBsListeners(bottomSheetUI);
    detachPoiButtonListeners(bottomSheetUI);
    detachClusterBsListener(bottomSheetUI);

    // _displayedObject setzen
    bottomSheetUI.setClickedObject(clickedObject);

    // 2. Prüfen, ob es sich um einen Cluster handelt
    if (clickedObject && clickedObject.getAllChildMarkers) {
        // Es handelt sich um einen Cluster.
        // Map und Markers werden intern in updateBsForCluster via Singleton bezogen
        updateBsForCluster(
            clickedObject,
            bottomSheetUI,
            backendService,
            mapState
        );
     bottomSheetUI.open(clickedObject);



    } else if (clickedObject && clickedObject.options && clickedObject.options.data) {
        // Es handelt sich um einen einzelnen Stolperstein (POI).
        updateBsForPoi(
            clickedObject,
            bottomSheetUI,
            backendService,
            mapState,
            addButtonUIInstance, 
            updatePoiUIInstance 
        );
    } else if (clickedObject && clickedObject.getLatLng()) { 
        // Klick auf die Karte für neue Adresse
        updateBsForNewAddress(
            clickedObject, 
            bottomSheetUI,
            backendService
        );
    } else {
        console.error("Fehler: Ungültiges Objekt für das Bottom Sheet.", clickedObject);
        bottomSheetUI.close();
    }
}

/**
 * Entfernt alle Event-Listener durch Klonen der DOM-Knoten.
 */
export function detachAllBsListeners(bottomSheetUI) {
    // 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
    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
    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
    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.");
}