// Variables globales
let map, marker, lastValidAddress = '';
let envioConfig = window.ENVIO_CONFIG || {
    minimo_compra_gratis: 250,
    costo_envio: 35,
    envio_habilitado: true
};

function calcularCostoEnvio(subtotal) {
    if (!envioConfig.envio_habilitado) return 0;
    return subtotal >= envioConfig.minimo_compra_gratis ? 0 : envioConfig.costo_envio;
}

function updateShippingHint(subtotal, deliveryChecked) {
    const hint = document.getElementById('shippingHint');
    if (!hint || !envioConfig.envio_habilitado) return;
    if (!deliveryChecked) {
        hint.textContent = `Envío gratis en compras desde $${envioConfig.minimo_compra_gratis.toFixed(2)}. Debajo de ese monto: $${envioConfig.costo_envio.toFixed(2)}.`;
        return;
    }
    const costo = calcularCostoEnvio(subtotal);
    if (costo === 0) {
        hint.textContent = '¡Envío GRATIS! Tu pedido alcanza el mínimo.';
        hint.className = 'shipping-hint free';
    } else {
        hint.textContent = `Se agregarán $${costo.toFixed(2)} de envío (mínimo gratis: $${envioConfig.minimo_compra_gratis.toFixed(2)}).`;
        hint.className = 'shipping-hint paid';
    }
}

function updateOrderTotals(cartItems, deliveryChecked) {
    const subtotal = cartItems.reduce((sum, item) => {
        return sum + (parseFloat(item.price) * parseInt(item.quantity, 10));
    }, 0);
    const shipping = deliveryChecked ? calcularCostoEnvio(subtotal) : 0;
    const total = subtotal + shipping;

    $('#subtotalDisplay').text(subtotal.toFixed(2));
    $('#totalAmountDisplay').text(total.toFixed(2));
    $('#totalAmountHidden').val(total.toFixed(2));
    $('#deliveryRequestedHidden').val(deliveryChecked ? '1' : '0');

    const shippingLine = document.getElementById('shippingLine');
    if (shippingLine) {
        if (deliveryChecked && shipping > 0) {
            shippingLine.style.display = 'block';
            $('#shippingDisplay').text(shipping.toFixed(2));
        } else if (deliveryChecked && shipping === 0) {
            shippingLine.style.display = 'block';
            $('#shippingDisplay').text('0.00 (gratis)');
        } else {
            shippingLine.style.display = 'none';
        }
    }

    updateShippingHint(subtotal, deliveryChecked);
    return { subtotal, shipping, total };
}

// Configuración de ícono
const tacoIcon = L.icon({
    iconUrl: 'imgs/restaurant.png',
    iconSize: [40, 40],
    iconAnchor: [20, 40],
    popupAnchor: [0, -35]
});

// Función para mostrar la pantalla de carga
function showLoader() {
    $('#loader-overlay').show();
}

// Función para ocultar la pantalla de carga
function hideLoader() {
    $('#loader-overlay').hide();
}

// Inicializar el mapa
function initMap() {
    if (!map) {
        map = L.map('map').setView([17.5542149, -99.5048416], 15);
        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            attribution: '© OpenStreetMap'
        }).addTo(map);

        map.on('click', async function (e) {
            showLoader();
            updateMapMarker(e.latlng);
            await reverseGeocode(e.latlng);
            hideLoader();
        });

        const locateButton = document.getElementById('locateButton');
        if (locateButton) {
            locateButton.addEventListener('click', locateUser);
        }
    } else {
        map.invalidateSize();
    }
}

// Función para obtener la ubicación del usuario
function locateUser() {
    showLoader();
    if ("geolocation" in navigator) {
        navigator.geolocation.getCurrentPosition(
            (position) => {
                const latlng = L.latLng(position.coords.latitude, position.coords.longitude);
                updateMapMarker(latlng);
                reverseGeocode(latlng);
                showAlert('Ubicación encontrada.', 'success');
                hideLoader();
            },
            (error) => {
                console.error("Error al obtener la ubicación:", error);
                showAlert('No se pudo obtener la ubicación. Por favor, habilite los permisos de ubicación o ingrese la dirección manualmente.', 'error');
                hideLoader();
            }
        );
    } else {
        showAlert('La geolocalización no es compatible con este navegador.', 'error');
        hideLoader();
    }
}

// Actualizar marcador en el mapa y campos de lat/lng
function updateMapMarker(latlng) {
    if (marker) {
        marker.setLatLng(latlng);
    } else {
        marker = L.marker(latlng, {
            icon: tacoIcon,
            draggable: true
        })
            .addTo(map)
            .bindPopup("Ubicación de entrega")
            .openPopup();

        marker.on('dragend', async function () {
            showLoader();
            await reverseGeocode(marker.getLatLng());
            hideLoader();
        });
    }
    map.setView(latlng, 17);

    document.getElementById('latitudeInput').value = latlng.lat;
    document.getElementById('longitudeInput').value = latlng.lng;
    document.getElementById('selected-location').textContent =
        `Ubicación seleccionada: ${latlng.lat.toFixed(6)}, ${latlng.lng.toFixed(6)}`;

    checkFormValidity();
}

// Geocodificación inversa
async function reverseGeocode(latlng) {
    try {
        const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${latlng.lat}&lon=${latlng.lng}`);
        const data = await response.json();
        if (data.address) {
            const address = formatAddress(data);
            document.getElementById('addressText').value = address;
            document.getElementById('addressSearch').value = address;
            if (marker) {
                marker.setPopupContent(`<b>Dirección:</b><br>${address}`).openPopup();
            }
            return address;
        }
    } catch (error) {
        console.error('Error en reverse geocoding:', error);
        showAlert('No se pudo obtener la dirección para esta ubicación', 'error');
    }
    return null;
}

// Formatear dirección
function formatAddress(data) {
    const addr = data.address;
    let addressParts = [];
    if (addr.road) addressParts.push(addr.road);
    if (addr.house_number) addressParts.push(addr.house_number);
    if (addr.neighbourhood) addressParts.push(addr.neighbourhood);
    if (addr.suburb && !addr.neighbourhood) addressParts.push(addr.suburb);
    if (addr.city || addr.town || addr.village) {
        addressParts.push(addr.city || addr.town || addr.village);
    }
    return addressParts.join(', ');
}

// Función para buscar una dirección
async function searchAddress() {
    const query = document.getElementById('addressSearch').value;
    if (!query) {
        showAlert('Por favor, ingrese una dirección para buscar.', 'error');
        return;
    }

    showLoader();
    try {
        const response = await fetch(`https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(query)}`);
        const data = await response.json();
        if (data && data.length > 0) {
            const latlng = L.latLng(data[0].lat, data[0].lon);
            updateMapMarker(latlng);
            showAlert('Dirección encontrada.', 'success');
        } else {
            showAlert('Dirección no encontrada.', 'error');
        }
    } catch (error) {
        console.error('Error searching for address:', error);
        showAlert('Ocurrió un error al buscar la dirección.', 'error');
    }
    hideLoader();
}

// Validaciones en tiempo real
function validateField(field) {
    const isValid = field.checkValidity();
    if (isValid) {
        $(field).removeClass('invalid').addClass('valid');
    } else {
        $(field).removeClass('valid').addClass('invalid');
    }
}

// Mostrar notificaciones estilo Rappi
function showAlert(message, type) {
    const alert = $(`
                <div class="alert alert-${type}" style="
                    position: fixed;
                    top: 20px;
                    left: 50%;
                    transform: translateX(-50%);
                    background: ${type === 'error' ? '#dc3545' : '#28a745'};
                    color: white;
                    padding: 12px 24px;
                    border-radius: 8px;
                    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
                    z-index: 2000;
                    animation: fadeIn 0.3s;
                ">
                    ${message}
                </div>
            `);
    $('body').append(alert);
    setTimeout(() => alert.fadeOut(300, () => alert.remove()), 3000);
}

// Función para verificar la validez del formulario y habilitar/deshabilitar los botones de pago
function checkFormValidity() {
    const form = document.getElementById('order-form');
    const cashBtn = document.getElementById('cash-btn');
    const mpBtn = document.getElementById('mp-btn');
    const deliveryCheckbox = document.getElementById('deliveryCheckbox');

    let isFormValid = false;

    if (deliveryCheckbox.checked) {
        const addressText = document.getElementById('addressText').value.trim();
        const lat = document.getElementById('latitudeInput').value;
        const fullName = document.getElementById('fullName').checkValidity();
        const phoneNumber = document.getElementById('phoneNumber').checkValidity();

        isFormValid = fullName && phoneNumber && addressText.length > 0 && lat.length > 0;
    } else {
        const fullName = document.getElementById('fullName').checkValidity();
        const phoneNumber = document.getElementById('phoneNumber').checkValidity();
        isFormValid = fullName && phoneNumber;
    }

    if (isFormValid) {
        cashBtn.removeAttribute('disabled');
        mpBtn.removeAttribute('disabled');
    } else {
        cashBtn.setAttribute('disabled', 'disabled');
        mpBtn.setAttribute('disabled', 'disabled');
    }
}

// Función para procesar el pago con Mercado Pago
async function processMercadoPago() {
    const form = document.getElementById('order-form');
    const formData = new FormData(form);
    formData.set('paymentMethod', 'mercadopago');

    showLoader();
    try {
        const response = await fetch('procesar_pedido.php', {
            method: 'POST',
            body: formData
        });
        const result = await response.json();
        hideLoader();

        if (result.success && result.redirect_url) {
            // Redirigir al usuario a la URL de Mercado Pago
            window.location.href = result.redirect_url;
        } else {
            showAlert(result.message || 'Error desconocido al procesar el pedido con Mercado Pago.', 'error');
        }
    } catch (error) {
        console.error('Error en la llamada a la API:', error);
        hideLoader();
        showAlert('Ocurrió un error en el servidor. Por favor, inténtelo de nuevo.', 'error');
    }
}

// Añadir un event listener al botón de Mercado Pago
document.getElementById('mp-btn').addEventListener('click', function(event) {
    event.preventDefault();
    // Validar el formulario antes de procesar el pago
    const form = document.getElementById('order-form');
    if (!form.checkValidity()) {
        showAlert('Por favor, completa todos los campos requeridos antes de continuar.', 'error');
        form.reportValidity();
        return;
    }
    processMercadoPago();
});

// Manejar el envío del formulario para el botón de efectivo
document.getElementById('order-form').addEventListener('submit', function(event) {
    const paymentMethod = event.submitter.value;
    // Si el método de pago es 'mercadopago', prevenir el envío normal
    if (paymentMethod === 'mercadopago') {
        event.preventDefault();
    }
});


// Inicialización principal
// Inicialización principal
$(document).ready(function () {
    let cartItems = [];
    const urlParams = new URLSearchParams(window.location.search);
    const cartItemsFromUrl = urlParams.get('cartItems');

    if (cartItemsFromUrl) {
        try {
            cartItems = JSON.parse(decodeURIComponent(cartItemsFromUrl));
            sessionStorage.setItem('cartItems', JSON.stringify(cartItems));
        } catch (e) {
            console.error('Error al parsear cartItems de URL:', e);
        }
    } else {
        const storedCart = sessionStorage.getItem('cartItems');
        if (storedCart) {
            try {
                cartItems = JSON.parse(storedCart);
            } catch (e) {
                console.error('Error al parsear cartItems de sessionStorage:', e);
            }
        }
    }

    if (!cartItems || cartItems.length === 0) {
        showAlert('No hay productos en el carrito. Por favor, agrega ítems antes de continuar.', 'error');
        setTimeout(() => {
            window.location.href = 'menu.php';
        }, 2000);
        return;
    }

    $('#cartItemsHidden').val(JSON.stringify(cartItems));
    const deliveryOptionContainer = $('#deliveryOptionContainer');
    if (envioConfig.envio_habilitado) {
        deliveryOptionContainer.show();
    } else {
        deliveryOptionContainer.hide();
    }

    const deliveryCheckedInit = document.getElementById('deliveryCheckbox')?.checked || false;
    updateOrderTotals(cartItems, deliveryCheckedInit);

    // Validaciones en tiempo real
    $('#fullName').on('input', function () {
        this.value = this.value.toUpperCase().replace(/[^A-ZÁÉÍÓÚÑÜ\s]/g, '');
        validateField(this);
        checkFormValidity();
    });

    $('#phoneNumber').on('input', function () {
        this.value = this.value.replace(/\D/g, '').substring(0, 10);
        validateField(this);
        checkFormValidity();
    });

    $('#addressText, #references').on('input', function () {
        validateField(this);
        checkFormValidity();
    });

    // --- MODIFICADO: Controlar visibilidad y limpieza de campos ---
    $('#deliveryCheckbox').change(function () {
        const deliveryFields = $('#deliveryFields');
        const pickupMessage = $('#pickupMessage');
        const addressText = $('#addressText');
        const latitudeInput = $('#latitudeInput');
        const stored = sessionStorage.getItem('cartItems');
        const items = stored ? JSON.parse(stored) : cartItems;
        updateOrderTotals(items, this.checked);

        if (this.checked) {
            // Usuario quiere servicio a domicilio
            deliveryFields.show();
            pickupMessage.hide();
            if (!map) initMap();
            addressText.prop('required', true);
            latitudeInput.prop('required', true);
        } else {
            // Usuario quiere recoger en sucursal
            deliveryFields.hide();
            pickupMessage.show();
            addressText.prop('required', false);
            latitudeInput.prop('required', false);

            // --- INICIO DE LÓGICA DE LIMPIEZA MEJORADA ---
            // Limpiar todos los campos relacionados con la entrega para evitar datos residuales
            if (marker) {
                map.removeLayer(marker);
                marker = null;
            }
            addressText.val('');
            $('#addressSearch').val('');
            $('#references').val('');
            latitudeInput.val('');
            $('#longitudeInput').val('');
            $('#selected-location').text('Ubicación no seleccionada');
            // --- FIN DE LÓGICA DE LIMPIEZA ---
        }
        checkFormValidity();
    });
    // --- FIN DE LA MODIFICACIÓN ---

    $('#deliveryCheckbox').prop('checked', false).change();
    updateShippingHint(
        cartItems.reduce((s, i) => s + parseFloat(i.price) * parseInt(i.quantity, 10), 0),
        false
    );
    checkFormValidity();
});

