import { ref, shallowRef, triggerRef } from 'vue'

// PERFORMANCE FIX: Los objetos de Google Maps NUNCA deben ir en refs profundos (ref)
// porque Vue intenta proxyficarlos ("deep reactivity") y rompe sus métodos internos
// provocando un fallo silencioso en setMap(null). Usamos shallowRef.
const markers = shallowRef<google.maps.Marker[]>([])
const polylines = shallowRef<google.maps.Polyline[]>([])
const infoWindows = shallowRef<google.maps.InfoWindow[]>([])
const circles = shallowRef<google.maps.Circle[]>([])
// Callback para sincronización externa (ej. useGoogleMaps globalOverlays)
const onLimpiarCallback = ref<(() => void) | null>(null)

// Singleton pattern using composable
export const useMapState = () => {

    const registrarMarker = (marker: any) => {
        if (marker) {
            markers.value.push(marker as google.maps.Marker)
            triggerRef(markers)
        }
        return marker
    }

    // Registrar una polyline
    const registrarPolyline = (polyline: google.maps.Polyline) => {
        if (polyline) {
            polylines.value.push(polyline)
            triggerRef(polylines)
        }
        return polyline
    }

    // Registrar un circle
    const registrarCircle = (circle: google.maps.Circle) => {
        if (circle) {
            circles.value.push(circle)
            triggerRef(circles)
        }
        return circle
    }

    // Registrar un InfoWindow
    const registrarInfoWindow = (infoWindow: google.maps.InfoWindow) => {
        if (infoWindow) {
            infoWindows.value.push(infoWindow)
            triggerRef(infoWindows)
        }
        return infoWindow
    }

    const registrarCallbackLimpieza = (fn: () => void) => {
        onLimpiarCallback.value = fn
    }

    // ⚠️ FUNCIÓN CRÍTICA: limpiar ABSOLUTAMENTE TODO del mapa
    const limpiarMapa = () => {
        console.log(`SIBU | Iniciando limpieza de ${markers.value.length} markers, ${polylines.value.length} polylines...`)

        // Eliminar markers y overlays HTML
        markers.value.forEach((m: any) => {
            try {
                if (m) {
                    if (typeof m.setMap === 'function') m.setMap(null);
                    if (typeof m.remove === 'function') m.remove();
                    if (typeof m.onRemove === 'function') m.onRemove();

                    if (typeof (window as any).google !== 'undefined' && (window as any).google.maps?.event?.clearInstanceListeners) {
                        (window as any).google.maps.event.clearInstanceListeners(m);
                    }
                }
            } catch (e) {
                console.warn('Error limpiando marker', e)
            }
        })
        markers.value = []

        // Eliminar polylines
        polylines.value.forEach((p: any) => {
            try {
                if (p && typeof p.setMap === 'function') p.setMap(null)
            } catch (e) {
                console.warn('Error limpiando polyline', e)
            }
        })
        polylines.value = []

        // Cerrar y limpiar infoWindows
        infoWindows.value.forEach((iw: any) => {
            try {
                if (iw && typeof iw.close === 'function') iw.close()
            } catch (e) {
                console.warn('Error limpiando infowindow', e)
            }
        })
        infoWindows.value = []

        // Eliminar circles
        circles.value.forEach((c: any) => {
            try {
                if (c && typeof c.setMap === 'function') c.setMap(null)
                if (c && typeof c.remove === 'function') c.remove()
            } catch (e) {
                console.warn('Error limpiando circle', e)
            }
        })
        circles.value = []

        // Ejecutar callback de limpieza externa si existe
        if (onLimpiarCallback.value) {
            try {
                onLimpiarCallback.value()
            } catch (e) {
                console.warn('Error en callback de limpieza externa', e)
            }
        }

        console.log('SIBU | Mapa limpiado completamente ✓')
    }

    return {
        markers,
        polylines,
        infoWindows,
        circles,
        registrarMarker,
        registrarPolyline,
        registrarCircle,
        registrarInfoWindow,
        registrarCallbackLimpieza,
        limpiarMapa
    }
}
