// Configuración de OpenStreetMap con detección automática silenciosa
let map;
let marker;
let ubicacionDetectada = false;
let intentosGeo = 0;
const MAX_INTENTOS = 2;

function initMap(lat = -25.3005, lng = -57.6362) {
    // Inicializar mapa con ubicación por defecto (Asunción)
    map = L.map('mapa').setView([lat, lng], 13);
    
    // Capa híbrida de OpenStreetMap
    const baseLayer = L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png', {
        attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> &copy; <a href="https://carto.com/attributions">CARTO</a>',
        subdomains: 'abcd',
        maxZoom: 19,
        minZoom: 3
    }).addTo(map);
    
    // Capa satelital
    const satelliteLayer = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
        attribution: 'Tiles &copy; Esri'
    });
    
    // Capa de calles
    const streetLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '&copy; OpenStreetMap'
    });
    
    // Control de capas (sin mostrarlo visiblemente)
    const baseMaps = {
        "Híbrida": baseLayer,
        "Satélite": satelliteLayer,
        "Calles": streetLayer
    };
    
    // Agregar control de capas pero minimizado
    L.control.layers(baseMaps, null, { position: 'bottomright' }).addTo(map);
    
    // Marcador (inicialmente oculto hasta detectar ubicación)
    marker = L.marker([lat, lng], { 
        draggable: true,
        opacity: 0 // Inicialmente invisible
    }).addTo(map);
    
    marker.on('dragend', function(e) {
        const position = marker.getLatLng();
        document.getElementById('latitud').value = position.lat.toFixed(8);
        document.getElementById('longitud').value = position.lng.toFixed(8);
        marker.setOpacity(1); // Hacer visible cuando el usuario lo mueve
    });
    
    map.on('click', function(e) {
        marker.setLatLng(e.latlng);
        document.getElementById('latitud').value = e.latlng.lat.toFixed(8);
        document.getElementById('longitud').value = e.latlng.lng.toFixed(8);
        marker.setOpacity(1);
    });
    
    // Detectar ubicación automáticamente (de manera silenciosa)
    detectarUbicacionSilenciosa();
}

// Detección silenciosa de ubicación
function detectarUbicacionSilenciosa() {
    if (navigator.geolocation) {
        // Intentar obtener ubicación con timeout corto y sin mensajes visibles
        navigator.geolocation.getCurrentPosition(
            function(position) {
                // Éxito - ubicación detectada
                const lat = position.coords.latitude;
                const lng = position.coords.longitude;
                
                // Centrar mapa en la ubicación detectada
                map.setView([lat, lng], 15);
                
                // Actualizar marcador
                marker.setLatLng([lat, lng]);
                marker.setOpacity(0.7); // Semi-visible
                
                // Actualizar campos ocultos
                document.getElementById('latitud').value = lat.toFixed(8);
                document.getElementById('longitud').value = lng.toFixed(8);
                
                ubicacionDetectada = true;
                
                // Intentar obtener dirección en segundo plano (sin mostrar)
                obtenerDireccionSilenciosa(lat, lng);
                
                // Auto-completar ciudad silenciosamente
                autoCompletarCiudad(lat, lng);
            },
            function(error) {
                // Error silencioso - no mostrar alertas
                console.log('Geo error:', error.code);
                intentosGeo++;
                
                if (intentosGeo < MAX_INTENTOS) {
                    // Reintentar con menor precisión
                    setTimeout(function() {
                        navigator.geolocation.getCurrentPosition(
                            function(position) {
                                const lat = position.coords.latitude;
                                const lng = position.coords.longitude;
                                map.setView([lat, lng], 14);
                                marker.setLatLng([lat, lng]);
                                marker.setOpacity(0.5);
                                document.getElementById('latitud').value = lat.toFixed(8);
                                document.getElementById('longitud').value = lng.toFixed(8);
                                autoCompletarCiudad(lat, lng);
                            },
                            function() {},
                            { enableHighAccuracy: false, timeout: 5000, maximumAge: 60000 }
                        );
                    }, 500);
                } else {
                    // Usar ubicación por IP como fallback
                    obtenerUbicacionPorIP();
                }
            },
            {
                enableHighAccuracy: false, // Baja precisión para ser más rápido
                timeout: 3000,              // Timeout corto (3 segundos)
                maximumAge: 300000          // Usar caché de 5 minutos
            }
        );
    } else {
        // Geolocalización no soportada, usar IP
        obtenerUbicacionPorIP();
    }
}

// Obtener ubicación por IP (fallback)
function obtenerUbicacionPorIP() {
    fetch('https://ipapi.co/json/')
        .then(response => response.json())
        .then(data => {
            if (data.latitude && data.longitude) {
                const lat = parseFloat(data.latitude);
                const lng = parseFloat(data.longitude);
                map.setView([lat, lng], 12);
                marker.setLatLng([lat, lng]);
                marker.setOpacity(0.5);
                document.getElementById('latitud').value = lat.toFixed(8);
                document.getElementById('longitud').value = lng.toFixed(8);
                autoCompletarCiudad(lat, lng);
            }
        })
        .catch(error => console.log('IP geo error:', error));
}

// Obtener dirección silenciosamente (sin mostrar notificaciones)
function obtenerDireccionSilenciosa(lat, lng) {
    const url = `https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lng}&zoom=18&addressdetails=1`;
    
    fetch(url)
        .then(response => response.json())
        .then(data => {
            if (data && data.display_name) {
                // Guardar en localStorage para uso futuro
                localStorage.setItem('ultima_ubicacion', JSON.stringify({
                    lat: lat,
                    lng: lng,
                    direccion: data.display_name,
                    timestamp: Date.now()
                }));
            }
        })
        .catch(error => console.log('Reverse geo error:', error));
}

// Auto-completar ciudad silenciosamente
function autoCompletarCiudad(lat, lng) {
    const url = `https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lng}&zoom=10&addressdetails=1`;
    
    fetch(url)
        .then(response => response.json())
        .then(data => {
            if (data && data.address) {
                const ciudad = data.address.city || data.address.town || data.address.village || data.address.suburb || '';
                const inputCiudad = document.getElementById('ciudad');
                const selectDepartamento = document.getElementById('departamento');
                
                // Auto-completar ciudad si está vacía
                if (ciudad && inputCiudad && inputCiudad.value === '') {
                    inputCiudad.value = ciudad;
                }
                
                // Intentar determinar departamento (estado/provincia)
                const departamento = data.address.state || data.address.region || '';
                if (departamento && selectDepartamento) {
                    // Verificar si el departamento existe en la lista
                    for (let i = 0; i < selectDepartamento.options.length; i++) {
                        if (selectDepartamento.options[i].value.toLowerCase() === departamento.toLowerCase()) {
                            selectDepartamento.value = selectDepartamento.options[i].value;
                            break;
                        }
                    }
                }
            }
        })
        .catch(error => console.log('City auto-complete error:', error));
}

// Función para obtener ubicación en segundo plano (sin UI)
function actualizarUbicacionSilenciosa() {
    if (navigator.geolocation && !ubicacionDetectada) {
        navigator.geolocation.getCurrentPosition(
            function(position) {
                const lat = position.coords.latitude;
                const lng = position.coords.longitude;
                marker.setLatLng([lat, lng]);
                document.getElementById('latitud').value = lat.toFixed(8);
                document.getElementById('longitud').value = lng.toFixed(8);
                if (document.getElementById('ciudad') && document.getElementById('ciudad').value === '') {
                    autoCompletarCiudad(lat, lng);
                }
            },
            function() {},
            { enableHighAccuracy: false, timeout: 5000, maximumAge: 600000 }
        );
    }
}

// Exportar funciones necesarias
window.actualizarUbicacionSilenciosa = actualizarUbicacionSilenciosa;

// Generar CAPTCHA
function generarCaptcha() {
    const num1 = Math.floor(Math.random() * 10) + 1;
    const num2 = Math.floor(Math.random() * 10) + 1;
    document.getElementById('captcha_num1').value = num1;
    document.getElementById('captcha_num2').value = num2;
    document.getElementById('captcha_resultado').value = '';
    document.getElementById('captcha_validado').value = 'false';
    
    // Actualizar pregunta visual
    const preguntaElem = document.getElementById('captcha_pregunta');
    if (preguntaElem) {
        preguntaElem.innerHTML = `${num1} + ${num2} = ?`;
    }
}

// Validar CAPTCHA
function validarCaptcha() {
    const num1 = parseInt(document.getElementById('captcha_num1').value);
    const num2 = parseInt(document.getElementById('captcha_num2').value);
    const resultado = parseInt(document.getElementById('captcha_resultado').value);
    
    if (num1 + num2 === resultado) {
        document.getElementById('captcha_validado').value = 'true';
        return true;
    } else {
        alert('CAPTCHA incorrecto. Por favor, verifique la suma.');
        return false;
    }
}

// Lista de departamentos de Paraguay
const departamentos = [
    "Alto Paraguay", "Alto Paraná", "Amambay", "Boquerón", "Caaguazú", 
    "Caazapá", "Canindeyú", "Central", "Concepción", "Cordillera", 
    "Guairá", "Itapúa", "Misiones", "Ñeembucú", "Paraguarí", 
    "Presidente Hayes", "San Pedro"
];

function cargarDepartamentos() {
    const select = document.getElementById('departamento');
    if (select) {
        select.innerHTML = '<option value="">Seleccione un departamento...</option>';
        departamentos.forEach(depto => {
            const option = document.createElement('option');
            option.value = depto;
            option.textContent = depto;
            select.appendChild(option);
        });
    }
}

// Inicializar cuando el DOM esté listo
document.addEventListener('DOMContentLoaded', function() {
    if (document.getElementById('mapa')) {
        const lat = document.getElementById('latitud')?.value || -25.3005;
        const lng = document.getElementById('longitud')?.value || -57.6362;
        initMap(parseFloat(lat), parseFloat(lng));
    }
    
    cargarDepartamentos();
    if (document.getElementById('captcha_num1')) {
        generarCaptcha();
    }
    
    // Intentar actualizar ubicación después de que el usuario interactúe
    setTimeout(function() {
        if (!ubicacionDetectada) {
            actualizarUbicacionSilenciosa();
        }
    }, 2000);
});