import Ajax from '../../../components/ajax.js';

document.addEventListener('DOMContentLoaded', function () {

    const TABLE_COLUMNS = ["input", "idlinea", "descripcion", "cnt_pedida", "precio_compra"];
    let dataTable;

    dataTable = $('#excelTable').DataTable({
        orderCellsTop: true,
        responsive: true,
        scrollX: true,
        lengthMenu: [5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500],
        pageLength: 25,
        lengthChange: true,
        dom: 'lfrtip',
        language: {
            url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
        },
        order: [[1, 'asc']]
    });

    // Crear filtros por columna en el segundo <tr>
    $('#excelTable thead tr:eq(1) th').each(function (i) {
        if (![0, 6, 7].includes(i)) { // No poner input en Checkbox, Notas ni Acciones
            $(this).html('<input type="text" class="form-control form-control-sm" placeholder="Filtrar..." />');
            $('input', this).on('keyup change', function () {
                if (dataTable.column(i).search() !== this.value) {
                    dataTable.column(i).search(this.value).draw();
                }
            });
        }
    });

    document.getElementById('excelFile').addEventListener('change', function (e) {
        const file = e.target.files[0];
        if (!file) return;

        const reader = new FileReader();
        reader.onload = function (e) {
            const data = new Uint8Array(e.target.result);
            const workbook = XLSX.read(data, { type: 'array' });

            const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
            const jsonData = XLSX.utils.sheet_to_json(firstSheet, { header: 1 });

            validateAndLoadDataTable(jsonData);
        };
        reader.readAsArrayBuffer(file);
    });

    async function validateAndLoadDataTable(data) {
        if (data.length === 0) return;

        const headers = data[0].map(h => h.toString().trim());
        const headerMap = {};
        headers.forEach((name, idx) => {
            headerMap[name.toLowerCase()] = idx;
        });

        const missing = TABLE_COLUMNS.filter(col => !(col in headerMap));
        if (missing.length > 0) {
            Swal.fire({
                title: 'Error',
                text: 'Faltan las siguientes columnas: ' + missing.join(', '),
                icon: 'error',
                confirmButtonText: 'Aceptar',
                buttonsStyling: true,
                customClass: { confirmButton: 'btn btn-danger' }
            });
            dataTable.clear().draw();
            return;
        }

        const rows = [];
        for (let i = 1; i < data.length; i++) {
            const rowData = TABLE_COLUMNS.map(col => data[i][headerMap[col]] ?? '');

            // Llamar backend para validar la fila
            const result = await validarFila(rowData);

            let checkboxHtml = '';
            let actionBtnsHtml = '';
            let notaHtml = '';

            if (result.apto) {
                checkboxHtml = `<input type="checkbox" class="select-row form-check-input" checked>`;
                notaHtml = '';
                actionBtnsHtml = `
                    <div class="d-flex flex-column align-items-start">
                        <button type="button" class="btn btn-outline-success btn-sm mb-1 importRow">
                            <i class="fas fa-file-import me-1"></i> Importar
                        </button>
                        <button type="button" class="btn btn-outline-danger btn-sm deleteRow">
                            <i class="fas fa-trash-alt me-1"></i> Eliminar
                        </button>
                    </div>
                `;
            } else {
                checkboxHtml = `<input type="checkbox" class="select-row form-check-input" disabled>`;
                notaHtml = `<span class="badge bg-danger">${result.reason}</span>`;
                actionBtnsHtml = `
                    <div class="d-flex flex-column align-items-start">
                        <span class="badge rounded-pill bg-danger mb-2">No Apto</span>
                        <button type="button" class="btn btn-outline-danger btn-sm deleteRow">
                            <i class="fas fa-trash-alt me-1"></i> Eliminar
                        </button>
                    </div>
                `;
            }

            rows.push([checkboxHtml, ...rowData, notaHtml, actionBtnsHtml]);
        }

        dataTable.clear().rows.add(rows).draw();

        setupEventListeners();
    }

    async function validarFila(rowData) {
        try {
            const response = await fetch('/importador/catalogo/validar-fila', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRF-TOKEN': '<?= csrf_hash() ?>'
                },
                body: JSON.stringify({ fila: rowData })
            });

            return await response.json();
        } catch (error) {
            console.error('Error validando fila', error);
            return { apto: false, reason: 'Error conexión' };
        }
    }

    function setupEventListeners() {
        $('#excelTable tbody').off('click', '.deleteRow').on('click', '.deleteRow', function () {
            dataTable.row($(this).parents('tr')).remove().draw();
        });

        $('#excelTable tbody').off('click', '.importRow').on('click', '.importRow', async function () {
            const $row = $(this).closest('tr');
            const rowData = dataTable.row($row).data();
            if (!rowData) return;

            const fila = rowData.slice(1, 6); // solo datos de negocio

            try {
                const response = await fetch('/importador/catalogo/importar-fila', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'X-CSRF-TOKEN': '<?= csrf_hash() ?>'
                    },
                    body: JSON.stringify({ fila: fila })
                });

                const result = await response.json();

                if (response.ok && result.status === 200) {
                    const skUrl = result.data?.sk_url?.replace('presupuestocliente', 'presupuestoadmin') ?? null;

                    // Actualizar campo "Notas" con el enlace
                    if (skUrl) {
                        const notasHtml = `<a href="${skUrl}" target="_blank" class="btn btn-sm btn-secondary">Ver presupuesto</a>`;
                        // La columna de notas es la posición 6 (índice 6)
                        rowData[6] = notasHtml;
                        dataTable.row($row).data(rowData).draw(false); // Redibujar la fila SIN perder scroll ni filtros
                    }

                    let html = skUrl
                        ? `La fila se importó exitosamente.<br><br><a href="${skUrl}" target="_blank" class="btn btn-primary mt-2">Ver presupuesto</a>`
                        : 'La fila se importó exitosamente.';
                    let icon = 'success';

                    if (result.price_warning) {
                        html = skUrl ? `La fila se importó exitosamente, pero el precio se ha ajustado debajo de costes.<br><br><a href="${skUrl}" target="_blank" class="btn btn-primary mt-2">Ver presupuesto</a>`
                        : 'La fila se importó exitosamente, pero el precio se ha ajustado debajo de costes.';
                        icon = 'warning';
                    }

                    Swal.fire({
                        title: 'Importado correctamente',
                        html: html,
                        icon: icon,
                        confirmButtonText: 'Aceptar',
                        buttonsStyling: true,
                        customClass: { confirmButton: 'btn btn-success' }
                    });
                } else {
                    Swal.fire({
                        title: 'Error',
                        text: result.message ?? 'Hubo un error al importar esta fila.',
                        icon: 'error',
                        confirmButtonText: 'Aceptar',
                        buttonsStyling: true,
                        customClass: { confirmButton: 'btn btn-danger' }
                    });
                }
            } catch (error) {
                console.error('Error en la llamada a importar-fila:', error);
                Swal.fire({
                    title: 'Error',
                    text: 'Error de comunicación con el servidor.',
                    icon: 'error',
                    confirmButtonText: 'Aceptar',
                    buttonsStyling: true,
                    customClass: { confirmButton: 'btn btn-danger' }
                });
            }
        });


        // Select All funcional
        $('#selectAll').off('change').on('change', function () {
            const checked = $(this).is(':checked');
            $('#excelTable tbody input.select-row:enabled').prop('checked', checked);
        });
    }

    /* Importacion */
    document.getElementById('importBtn').addEventListener('click', function () {
        const filasAptas = [];

        dataTable.rows().every(function () {
            const rowNode = this.node();
            const checkbox = $(rowNode).find('input.select-row');

            if (checkbox.length > 0 && checkbox.is(':checked') && !checkbox.is(':disabled')) {
                const rowData = this.data();
                filasAptas.push({ fila: rowData.slice(1, 6), rowNode: rowNode, rowData: rowData });
            }
        });

        if (filasAptas.length === 0) {
            Swal.fire({
                title: 'Atención',
                text: 'No hay filas aptas seleccionadas para importar.',
                icon: 'warning',
                confirmButtonText: 'Aceptar',
                buttonsStyling: true,
                customClass: { confirmButton: 'btn btn-warning' }
            });
            return;
        }

        Swal.fire({
            title: '¿Confirmar importación?',
            text: `Se van a importar ${filasAptas.length} filas.`,
            icon: 'warning',
            showCancelButton: true,
            confirmButtonText: 'Sí, importar',
            cancelButtonText: 'Cancelar',
            reverseButtons: true,
            buttonsStyling: true,
            customClass: {
                confirmButton: 'btn btn-primary',
                cancelButton: 'btn btn-secondary'
            }
        }).then(async (result) => {
            if (!result.isConfirmed) return;

            // array para contener los IDs que no se han podido ajustar
            let idsNoAjustados = [];

            for (const fila of filasAptas) {
                try {
                    const response = await fetch('/importador/catalogo/importar-fila', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRF-TOKEN': '<?= csrf_hash() ?>'
                        },
                        body: JSON.stringify({ fila: fila.fila })
                    });

                    const result = await response.json();

                    if (response.ok && result.status === 200) {
                        const skUrl = result.data?.sk_url?.replace('presupuestocliente', 'presupuestoadmin') ?? null;

                        if (result.price_warning) {
                            idsNoAjustados.push(result.data.sk_id);
                        }

                        if (skUrl) {
                            fila.rowData[6] = `<a href="${skUrl}" target="_blank" class="btn btn-sm btn-primary">Ver presupuesto</a>`;
                        } else {
                            fila.rowData[6] = `<span class="badge bg-success">Importado</span>`;
                        }
                    } else {
                        fila.rowData[6] = `<span class="badge bg-danger">${result.message ?? 'Error desconocido'}</span>`;
                    }

                    dataTable.row(fila.rowNode).data(fila.rowData).draw(false);

                } catch (error) {
                    console.error('Error importando fila:', error);
                    fila.rowData[6] = `<span class="badge bg-danger">Error de comunicación</span>`;
                    dataTable.row(fila.rowNode).data(fila.rowData).draw(false);
                }
            }

            let text = 'Se han procesado todas las filas seleccionadas.';
            let icon = 'success';
            if (idsNoAjustados.length > 0) {
                text = 'Se han procesado todas las filas seleccionadas, pero se han ajustado los siguientes presupuestos por debajo de costes: ' + idsNoAjustados.join(', ');
                icon = 'warning';
            }
            Swal.fire({
                title: 'Importación finalizada',
                text: text,
                icon: icon,
                confirmButtonText: 'Aceptar',
                buttonsStyling: true,
                customClass: { confirmButton: 'btn btn-success' }
            });
        });
    });


});
