/**
 * ============================================
 * SCRIPT.JS - FUNCIONES GLOBALES DEL SISTEMA
 * ============================================
 */

// --- Esperar a que el DOM esté listo ---
$(document).ready(function() {

    /**
     * 1. SIDEBAR TOGGLE (Móvil)
     */
    $('#sidebarToggle').on('click', function() {
        $('#sidebar').toggleClass('open');
        $('#sidebarBackdrop').toggleClass('show');
        $('body').toggleClass('sidebar-open');
    });

    $('#sidebarBackdrop').on('click', function() {
        $('#sidebar').removeClass('open');
        $('#sidebarBackdrop').removeClass('show');
        $('body').removeClass('sidebar-open');
    });

    /**
     * 2. TOOLTIPS (Bootstrap)
     */
    const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
    tooltipTriggerList.map(function(tooltipTriggerEl) {
        return new bootstrap.Tooltip(tooltipTriggerEl);
    });

    /**
     * 3. ALERTAS AUTOMÁTICAS
     */
    $('.alert').each(function() {
        const alert = $(this);
        setTimeout(function() {
            alert.fadeOut(500, function() {
                alert.remove();
            });
        }, 5000);
    });

    /**
     * 4. CONFIRMACIÓN DE ELIMINACIÓN MEJORADA
     */
    $('.delete-confirm').on('click', function(e) {
        e.preventDefault();
        const href = $(this).attr('href');
        const message = $(this).data('message') || '¿Estás seguro de eliminar este registro?';
        
        Swal.fire({
            title: 'Confirmar Eliminación',
            text: message,
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#dc3545',
            cancelButtonColor: '#6c757d',
            confirmButtonText: 'Sí, eliminar',
            cancelButtonText: 'Cancelar'
        }).then((result) => {
            if (result.isConfirmed) {
                window.location.href = href;
            }
        });
    });

    /**
     * 5. VALIDACIÓN DE FORMULARIOS EN TIEMPO REAL
     */
    $('form.needs-validation').each(function() {
        const form = $(this);
        
        form.find('input, select, textarea').on('blur', function() {
            validateField($(this));
        });
        
        form.on('submit', function(e) {
            let isValid = true;
            form.find('input, select, textarea').each(function() {
                if (!validateField($(this))) {
                    isValid = false;
                }
            });
            
            if (!isValid) {
                e.preventDefault();
                Swal.fire({
                    icon: 'error',
                    title: 'Error de Validación',
                    text: 'Por favor completa todos los campos requeridos correctamente.'
                });
            }
        });
    });

    /**
     * 6. VALIDAR CAMPO INDIVIDUAL
     */
    function validateField($field) {
        const value = $field.val().trim();
        const isRequired = $field.prop('required');
        const type = $field.attr('type');
        const minLength = $field.attr('minlength') || 0;
        let isValid = true;
        let errorMessage = '';

        // Limpiar estado anterior
        $field.removeClass('is-valid is-invalid');
        $field.next('.invalid-feedback').remove();

        if (isRequired && !value) {
            isValid = false;
            errorMessage = 'Este campo es obligatorio';
        } else if (value && type === 'email' && !isValidEmail(value)) {
            isValid = false;
            errorMessage = 'Ingresa un correo electrónico válido';
        } else if (value && minLength > 0 && value.length < minLength) {
            isValid = false;
            errorMessage = `Mínimo ${minLength} caracteres`;
        } else if (value && type === 'number') {
            const min = parseInt($field.attr('min')) || 0;
            const max = parseInt($field.attr('max')) || 999;
            const num = parseInt(value);
            if (num < min || num > max) {
                isValid = false;
                errorMessage = `Valor entre ${min} y ${max}`;
            }
        }

        // Mostrar feedback
        if (isValid && value) {
            $field.addClass('is-valid');
        } else if (!isValid) {
            $field.addClass('is-invalid');
            $field.after(`<div class="invalid-feedback">${errorMessage}</div>`);
        }

        return isValid;
    }

    /**
     * 7. VALIDAR EMAIL
     */
    function isValidEmail(email) {
        const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        return re.test(email);
    }

    /**
     * 8. MEDIDOR DE FUERZA DE CONTRASEÑA
     */
    $('#password, #new_password').on('input', function() {
        const password = $(this).val();
        const strengthBar = $(this).closest('.mb-3').find('.password-strength-bar');
        const strengthText = $(this).closest('.mb-3').find('.password-strength-text');
        
        if (!strengthBar.length || !strengthText.length) return;
        
        let strength = 0;
        let level = '';
        let color = '';
        
        if (password.length >= 6) strength++;
        if (password.length >= 10) strength++;
        if (/[a-z]/.test(password) && /[A-Z]/.test(password)) strength++;
        if (/[0-9]/.test(password)) strength++;
        if (/[^a-zA-Z0-9]/.test(password)) strength++;

        if (password.length === 0) {
            strengthBar.css('width', '0');
            strengthText.text('Mínimo 6 caracteres');
            strengthText.removeClass('weak medium strong');
            return;
        }
        
        if (strength <= 2) {
            level = 'weak';
            color = '#dc3545';
            strengthText.text('Débil');
        } else if (strength <= 4) {
            level = 'medium';
            color = '#ffc107';
            strengthText.text('Media');
        } else {
            level = 'strong';
            color = '#28a745';
            strengthText.text('Fuerte');
        }
        
        strengthBar.removeClass('weak medium strong').addClass(level);
        strengthText.removeClass('weak medium strong').addClass(level);
        strengthBar.css('background', color);
        strengthText.css('color', color);
    });

    /**
     * 9. MOSTRAR/OCULTAR CONTRASEÑA
     */
    $('.toggle-password').on('click', function() {
        const passwordInput = $(this).closest('.input-group').find('input');
        const icon = $(this).find('i');
        
        if (passwordInput.attr('type') === 'password') {
            passwordInput.attr('type', 'text');
            icon.removeClass('fa-eye').addClass('fa-eye-slash');
        } else {
            passwordInput.attr('type', 'password');
            icon.removeClass('fa-eye-slash').addClass('fa-eye');
        }
    });

    /**
     * 10. DATATABLE - CONFIGURACIÓN GLOBAL
     */
    if ($.fn.DataTable) {
        $.extend($.fn.dataTable.defaults, {
            language: {
                url: '//cdn.datatables.net/plug-ins/1.13.6/i18n/es-ES.json'
            },
            pageLength: 10,
            responsive: true,
            autoWidth: false
        });
    }

    /**
     * 11. EXPORTAR A PDF (Función Global)
     */
    window.exportToPDF = function(tableId, title, filename) {
        if (typeof window.jspdf === 'undefined') {
            Swal.fire({
                icon: 'error',
                title: 'Error',
                text: 'La librería jsPDF no está cargada'
            });
            return;
        }

        const table = $('#' + tableId).DataTable();
        const data = table.rows({ search: 'applied' }).data();
        
        if (data.length === 0) {
            Swal.fire({
                icon: 'warning',
                title: 'Sin Datos',
                text: 'No hay datos para exportar con los filtros actuales'
            });
            return;
        }

        const { jsPDF } = window.jspdf;
        const doc = new jsPDF({
            orientation: 'landscape',
            unit: 'mm',
            format: 'a4'
        });

        // Título
        doc.setFontSize(18);
        doc.setTextColor(0, 40, 85);
        doc.text(title || 'Reporte del Sistema', 14, 20);
        
        // Fecha
        doc.setFontSize(10);
        doc.setTextColor(100);
        const now = new Date();
        const fecha = now.toLocaleString('es-ES', {
            day: '2-digit',
            month: '2-digit',
            year: 'numeric',
            hour: '2-digit',
            minute: '2-digit'
        });
        doc.text('Exportado: ' + fecha, 14, 27);

        // Preparar datos
        const headers = [];
        const rows = [];
        
        // Obtener encabezados de la tabla
        const $table = $('#' + tableId);
        $table.find('thead th').each(function() {
            const text = $(this).text().trim();
            if (text !== 'Acciones' && text !== 'Estado') {
                headers.push(text);
            }
        });

        // Obtener datos de las filas
        data.each(function(rowData) {
            const $row = $(rowData);
            const row = [];
            $row.find('td').each(function(index) {
                // Saltar columna de acciones (última columna)
                if (index < headers.length) {
                    row.push($(this).text().trim());
                }
            });
            rows.push(row);
        });

        doc.autoTable({
            head: [headers],
            body: rows,
            startY: 35,
            theme: 'grid',
            headStyles: {
                fillColor: [0, 40, 85],
                textColor: [255, 255, 255],
                fontSize: 10,
                halign: 'center'
            },
            bodyStyles: {
                fontSize: 9
            },
            margin: { left: 14, right: 14 }
        });

        // Pie de página
        const pageCount = doc.internal.getNumberOfPages();
        for (let i = 1; i <= pageCount; i++) {
            doc.setPage(i);
            doc.setFontSize(8);
            doc.setTextColor(150);
            doc.text(
                `Sistema Web - Página ${i} de ${pageCount}`,
                14,
                doc.internal.pageSize.height - 10
            );
        }

        doc.save((filename || 'reporte') + '_' + now.toISOString().slice(0,10) + '.pdf');

        Swal.fire({
            icon: 'success',
            title: 'PDF Exportado',
            text: 'El archivo PDF se ha generado correctamente'
        });
    };

    /**
     * 12. NOTIFICACIONES TOAST
     */
    window.showToast = function(message, type, title) {
        const icons = {
            success: 'fa-check-circle',
            error: 'fa-times-circle',
            warning: 'fa-exclamation-triangle',
            info: 'fa-info-circle'
        };
        
        const colors = {
            success: '#28a745',
            error: '#dc3545',
            warning: '#ffc107',
            info: '#17a2b8'
        };

        let container = $('.toast-container');
        if (!container.length) {
            container = $('<div class="toast-container"></div>');
            $('body').append(container);
        }

        const toast = $(`
            <div class="toast-custom ${type}">
                <i class="fas ${icons[type] || icons.info}" style="color: ${colors[type] || colors.info};"></i>
                <div>
                    <strong>${title || ''}</strong>
                    <div style="font-size: 0.9rem;">${message}</div>
                </div>
                <button type="button" class="btn-close ms-auto" style="font-size: 0.7rem;"></button>
            </div>
        `);

        container.append(toast);

        toast.find('.btn-close').on('click', function() {
            toast.fadeOut(300, function() {
                toast.remove();
            });
        });

        setTimeout(function() {
            toast.fadeOut(300, function() {
                toast.remove();
            });
        }, 4000);
    };

    /**
     * 13. FILTRO EN TIEMPO REAL PARA TABLAS
     */
    $('.search-input').on('keyup', function() {
        const tableId = $(this).data('table');
        if (tableId && $.fn.DataTable.isDataTable('#' + tableId)) {
            $('#' + tableId).DataTable().search($(this).val()).draw();
        }
    });

    /**
     * 14. SELECTORES CON BÚSQUEDA
     */
    $('.select-search').each(function() {
        // Implementación de Select2 si está disponible
        if (typeof $.fn.select2 !== 'undefined') {
            $(this).select2({
                placeholder: $(this).data('placeholder') || 'Selecciona una opción',
                allowClear: true,
                theme: 'bootstrap-5'
            });
        }
    });

    /**
     * 15. MASCARAS PARA CAMPOS
     */
    $('.input-phone').on('input', function() {
        let value = $(this).val().replace(/\D/g, '');
        if (value.length > 0) {
            value = value.substring(0, 9);
            if (value.length > 6) {
                value = value.substring(0, 3) + ' ' + value.substring(3, 6) + ' ' + value.substring(6);
            } else if (value.length > 3) {
                value = value.substring(0, 3) + ' ' + value.substring(3);
            }
            $(this).val(value);
        }
    });

    /**
     * 16. CONFIRMACIÓN PARA ACCIONES
     */
    window.confirmAction = function(message, callback) {
        Swal.fire({
            title: 'Confirmar',
            text: message || '¿Estás seguro de realizar esta acción?',
            icon: 'question',
            showCancelButton: true,
            confirmButtonColor: '#002855',
            cancelButtonColor: '#6c757d',
            confirmButtonText: 'Sí, continuar',
            cancelButtonText: 'Cancelar'
        }).then((result) => {
            if (result.isConfirmed && typeof callback === 'function') {
                callback();
            }
        });
    };

    /**
     * 17. ACTUALIZAR CONTADORES EN TIEMPO REAL
     */
    function updateCounters() {
        $('.counter').each(function() {
            const url = $(this).data('url');
            if (url) {
                $.get(url, function(data) {
                    $(this).text(data.total || 0);
                }.bind(this));
            }
        });
    }

    // Actualizar contadores cada 30 segundos
    setInterval(updateCounters, 30000);

    /**
     * 18. DETECTAR CAMBIOS EN EL NAVEGADOR
     */
    let lastUrl = window.location.href;
    setInterval(function() {
        if (window.location.href !== lastUrl) {
            lastUrl = window.location.href;
            // Recargar datos si es necesario
        }
    }, 1000);

    /**
     * 19. PREVENIR ENVÍO DUPLICADO DE FORMULARIOS
     */
    $('form').on('submit', function() {
        const $btn = $(this).find('button[type="submit"]');
        if ($btn.length) {
            $btn.prop('disabled', true);
            $btn.html('<span class="loading-spinner me-2"></span> Procesando...');
            setTimeout(function() {
                $btn.prop('disabled', false);
                $btn.html($btn.data('original-text') || $btn.html());
            }, 5000);
        }
    });

    // Guardar texto original de botones
    $('button[type="submit"]').each(function() {
        $(this).data('original-text', $(this).html());
    });

    /**
     * 20. SOPORTE PARA TECLADO (Accesibilidad)
     */
    $(document).on('keydown', function(e) {
        // Ctrl+Shift+E = Editar
        if (e.ctrlKey && e.shiftKey && e.key === 'E') {
            const editBtn = $('.btn-edit:first');
            if (editBtn.length) {
                window.location.href = editBtn.attr('href');
            }
        }
        // Ctrl+Shift+N = Nuevo
        if (e.ctrlKey && e.shiftKey && e.key === 'N') {
            const newBtn = $('.btn-new:first');
            if (newBtn.length) {
                window.location.href = newBtn.attr('href');
            }
        }
    });

    console.log('✅ Sistema Web - Scripts cargados correctamente');
    console.log(`📅 ${new Date().toLocaleString()}`);
});