jQuery(document).ready(function($) {
    const { __ } = (window.wp && window.wp.i18n) ? window.wp.i18n : { __: (s) => s };
    'use strict';

    const $body = $(document.body);
    let isRestoringShippingMethod = false;

    // Función para detectar si el carrito contiene productos virtuales/descargables
    function isCartVirtualOrDownloadable() {
        let hasVirtualOrDownloadable = false;
        
        // Verificar si hay productos en el carrito
        $('.ckfylt25-cart-item, .cart-item').each(function() {
            const $item = $(this);
            const productName = $item.find('.ckfylt25-cart-item__name, .cart-item__name').text().toLowerCase();
            
            // Detectar productos virtuales o descargables por nombre o clase
            if (productName.includes('virtual') || 
                productName.includes('download') || 
                productName.includes('digital') || 
                productName.includes('ebook') || 
                productName.includes('software') ||
                productName.includes('course') ||
                productName.includes('membership') ||
                $item.hasClass('virtual-product') ||
                $item.hasClass('downloadable-product')) {
                hasVirtualOrDownloadable = true;
                return false; // Salir del bucle each
            }
        });
        
        // También verificar si WooCommerce indica que no necesita envío
        if (typeof wc_checkout_params !== 'undefined' && wc_checkout_params.needs_shipping === 'false') {
            hasVirtualOrDownloadable = true;
        }
        
        // Verificar si hay elementos que indiquen que no se necesita envío
        if ($('.woocommerce-shipping-fields, .woocommerce-shipping-fields--hidden').length > 0) {
            hasVirtualOrDownloadable = true;
        }
        
        return hasVirtualOrDownloadable;
    }

    // Función para detectar si solo hay una opción de envío y es Free shipping
    function hasOnlyFreeShippingOption() {
        const $shippingMethods = $('input[name^="shipping_method"]');
        
        // Si solo hay un método de envío disponible
        if ($shippingMethods.length === 1) {
            const methodText = $shippingMethods.closest('li').find('label').text().toLowerCase();
            
            // Verificar si es Free shipping
            if (methodText.includes('free shipping') || 
                methodText.includes('gratis') || 
                methodText.includes('free') ||
                $shippingMethods.val().includes('free_shipping')) {
                console.log('Solo hay una opción de envío y es Free shipping - auto-seleccionando');
                return true;
            }
        }
        
        return false;
    }

    // Función para mover los métodos de envío al placeholder
    function moveShippingMethodsToStep2() {
        const $orderReview = $('#order_review');
        const $shippingMethodsPlaceholder = $('#custom_shipping_methods_placeholder');

        if (!$orderReview.length || !$shippingMethodsPlaceholder.length) {
            console.log('No se encontraron los contenedores para mover métodos de envío.');
            return;
        }

        $shippingMethodsPlaceholder.empty();

        const $shippingMethodsList = $orderReview.find('ul.woocommerce-shipping-methods');
        const $shippingCalculator = $orderReview.find('.woocommerce-shipping-calculator');

        if ($shippingMethodsList.length) {
            const $clonedMethodsList = $shippingMethodsList.clone(true);
            $clonedMethodsList.appendTo($shippingMethodsPlaceholder);
            console.log('Métodos de envío clonados y movidos.');

            if ($shippingCalculator.length) {
                const $clonedCalculator = $shippingCalculator.clone(true);
                $clonedCalculator.appendTo($shippingMethodsPlaceholder);
                console.log('Formulario de calculadora de envío clonado y movido.');
            }

            // Habilitar métodos de envío
            $shippingMethodsPlaceholder.find('input[name^="shipping_method"]').prop('disabled', false);

            // Event listener para cambios en métodos de envío
            $shippingMethodsPlaceholder.find('input[name^="shipping_method"]').off('change').on('change', function() {
                if (isRestoringShippingMethod) return;

                const selectedMethod = $(this).val();
                console.log('Método de envío cambiado:', selectedMethod);

                // Guardar la selección del usuario
                sessionStorage.setItem('selected_shipping_method', selectedMethod);

                $body.trigger('update_checkout');
                updateShippingSummary();
            });

            // Restaurar la selección del usuario después del update_checkout
            setTimeout(function() {
                const savedMethod = sessionStorage.getItem('selected_shipping_method');
                if (savedMethod) {
                    const $savedInput = $shippingMethodsPlaceholder.find(`input[name^="shipping_method"][value="${savedMethod}"]`);
                    if ($savedInput.length && !$savedInput.is(':checked')) {
                        isRestoringShippingMethod = true;
                        $savedInput.prop('checked', true);
                        console.log('Restaurado método de envío:', savedMethod);
                        updateShippingSummary();
                        setTimeout(() => { isRestoringShippingMethod = false; }, 50);
                    }
                }
            }, 100);

        } else {
            console.log('No se encontraron métodos de envío para mover en #order_review.');
        }
    }

    // Función para actualizar el resumen de envío
    function updateShippingSummary() {
        const $selectedMethod = $('input[name^="shipping_method"]:checked');
        if ($selectedMethod.length > 0) {
            const methodId = $selectedMethod.val();
            const $methodLabel = $selectedMethod.closest('li').find('label');
            const methodText = $methodLabel.text().trim();

        
            // Extraer el precio del texto del método
            const priceMatch = methodText.match(/[\$€£Q]\s*[\d,]+\.?\d*/);
            const price = priceMatch ? priceMatch[0].trim() : '';

            console.log('Texto del método:', methodText);
            console.log('Match del precio:', priceMatch);
            console.log('Precio extraído:', price);

            // Actualizar el resumen de envío en el sidebar
            $('#cart-shipping').text(price);

            // Actualizar el total del carrito
            updateCartTotal();

            console.log('Método de envío actualizado:', methodText, 'Precio:', price);
        }
    }

    // Función para actualizar el total del carrito
    function updateCartTotal() {
        // Obtener el subtotal
        const subtotalText = $('.total-row:first-child .amount').text().trim();
        const subtotalMatch = subtotalText.match(/[\$€£Q]?\s*[\d,]+\.?\d*/);
        const subtotal = subtotalMatch ? parseFloat(subtotalMatch[0].replace(/[\$€£Q,\s]/g, '')) : 0;

        // Obtener el precio de envío
        const shippingText = $('#cart-shipping').text().trim();
        const shippingMatch = shippingText.match(/[\$€£Q]?\s*[\d,]+\.?\d*/);
        const shipping = shippingMatch ? parseFloat(shippingMatch[0].replace(/[\$€£Q,\s]/g, '')) : 0;

        // Calcular el total
        const total = subtotal + shipping;

        // Formatear el total con el símbolo de moneda
        const currencySymbol = subtotalText.match(/[\$€£Q]/) ? subtotalText.match(/[\$€£Q]/)[0] : '$';
        const formattedTotal = currencySymbol + total.toFixed(2);

        // Actualizar el total en el sidebar
        $('.total-row.total-final .amount').text(formattedTotal);

        console.log('Total actualizado:', formattedTotal, 'Subtotal:', subtotal, 'Envío:', shipping);
    }

    // Función para inicializar el checkout
    function onCheckoutUpdate() {
        console.log('onCheckoutUpdate disparado.');

        // Ajustar marcadores de requerido según configuración
        const cfg = window.ckfylt25CheckoutConfig || {};
        const disabled = Array.isArray(cfg.disabledBillingFields) ? cfg.disabledBillingFields : [];
        const ids = [
            'billing_email',
            'billing_first_name',
            'billing_last_name',
            'billing_address_1',
            'billing_city',
            'billing_country',
            'billing_state',
            'billing_postcode'
        ];
        ids.forEach(function(id) {
            const key = id; // las opciones usan claves completas tipo billing_* 
            if (cfg.allowWithoutAddress === true || disabled.indexOf(key) !== -1) {
                $('#' + id).prop('required', false);
            } else {
                $('#' + id).prop('required', true);
            }
        });

        // Ejecutar las funciones de actualización de contenido
        moveShippingMethodsToStep2();
    }

    // Event listener para cambios en métodos de envío
    $(document).on('change', 'input[name^="shipping_method"]', function() {
        updateShippingSummary();
    });

    // Inicializar y actualizar el checkout
    $body.on('init_checkout updated_checkout', function() {
        onCheckoutUpdate();
        updateShippingSummary();

        // Restaurar la selección de envío después del update_checkout
        const savedMethod = sessionStorage.getItem('selected_shipping_method');
        if (savedMethod) {
            setTimeout(function() {
                const $savedInput = $('#custom_shipping_methods_placeholder').find(`input[name^="shipping_method"][value="${savedMethod}"]`);
                if ($savedInput.length && !$savedInput.is(':checked')) {
                    isRestoringShippingMethod = true;
                    $savedInput.prop('checked', true);
                    console.log('Restaurado método de envío después de update_checkout:', savedMethod);
                    updateShippingSummary();
                    setTimeout(() => { isRestoringShippingMethod = false; }, 50);
                }
            }, 200);
        }
    });

    // Manejar el envío del formulario
    $('form.checkout').on('submit', function(e) {
        const cfg = window.ckfylt25CheckoutConfig || {};
        const disabled = Array.isArray(cfg.disabledBillingFields) ? cfg.disabledBillingFields : [];
        
        // Si está permitido comprar sin dirección, no mostrar alerta de campos requeridos aquí
        if (cfg.allowWithoutAddress === true) {
            return; // dejar que WooCommerce maneje la validación mínima del servidor
        }

        // Validar campos requeridos (excluyendo los deshabilitados)
        const requiredFields = [
            '#billing_email',
            '#billing_first_name', 
            '#billing_last_name',
            '#billing_address_1',
            '#billing_city',
            '#billing_country',
            '#billing_state',
            '#billing_postcode'
        ].filter(function(selector) {
            const key = selector.replace('#', '');
            return disabled.indexOf(key) === -1;
        });

        let isValid = true;
        requiredFields.forEach(function(field) {
            const $field = $(field);
            if (!$field.val().trim()) {
                $field.addClass('error');
                isValid = false;
            } else {
                $field.removeClass('error');
            }
        });

        if (!isValid) {
            e.preventDefault();
            alert( __('Please complete all required fields.', 'checkoutify-lite') );
            return false;
        }
    });

    // Estilos para campos con error - movidos a CSS externo
    // Los estilos ahora están en el archivo CSS del template

    // Inicializar al cargar la página
    onCheckoutUpdate();
});
