/**
 * ZLETS - Letras.js
 * Lógica para registro en lote y gestión de letras
 */

/**
 * Generar filas dinámicas de letras en el formulario de registro
 */
function generarFilasLetras() {
    const cantidad = parseInt(document.getElementById('cantidad_letras_input').value) || 0;

    if (cantidad < 1 || cantidad > 50) {
        showToast('warning', 'Ingrese una cantidad entre 1 y 50');
        return;
    }

    const tbody = document.getElementById('letras-tbody');
    const container = document.getElementById('letras-container');
    const hidden = document.getElementById('cantidad_letras_hidden');

    // Obtener importe total de la factura
    const importeFactura = parseFloat(document.querySelector('input[name="importe_factura"]')?.value) || 0;
    const importePorLetra = cantidad > 0 ? (importeFactura / cantidad).toFixed(2) : 0;

    tbody.innerHTML = '';
    hidden.value = cantidad;
    container.classList.remove('hidden');

    const monedaGrupo = document.getElementById('moneda_grupo')?.value || 'USD';
    // Obtener la fecha de emisión global de las letras para usarla como base
    const fechaEmisionLetrasGlobal = document.getElementById('fecha_emision_letras_global')?.value;
    const fechaEmisionLetraDefault = fechaEmisionLetrasGlobal || new Date().toISOString().split('T')[0];

    for (let i = 0; i < cantidad; i++) {
        const plazoDefault = 30 + (i * 5); // Plazo escalonado
        const numeroLetraGenerado = String(i + 1).padStart(3, '0'); // Autogenerar número: 001, 002...

        const tr = document.createElement('tr');
        tr.className = 'border-b border-white/3 hover:bg-white/3 transition-colors fila-letra';
        tr.innerHTML = `
            <td class="px-2 py-2 text-center text-gray-500 text-xs font-semibold fila-numero">${i + 1}</td>
            <td class="px-2 py-1">
                <input type="text" name="numero_letra[${i}]" value="${numeroLetraGenerado}" required class="input-table" placeholder="Nº letra">
            </td>
            <td class="px-2 py-1">
                <input type="number" name="renovacion[${i}]" value="0" min="0" class="input-table w-14">
            </td>
            <td class="px-2 py-1">
                <select name="tipo_letra[${i}]" class="input-table">
                    <option value="ORI">ORI</option>
                    <option value="REN">REN</option>
                </select>
            </td>
            <td class="px-2 py-1">
                <select name="moneda_letra[${i}]" class="input-table">
                    <option value="USD" ${monedaGrupo === 'USD' ? 'selected' : ''}>USD</option>
                    <option value="PEN" ${monedaGrupo === 'PEN' ? 'selected' : ''}>PEN</option>
                </select>
            </td>
            <td class="px-2 py-1">
                <input type="date" name="fecha_emision[${i}]" value="${fechaEmisionLetraDefault}" required class="input-table"
                       onchange="calcularVencimiento(${i})">
            </td>
            <td class="px-2 py-1">
                <input type="number" name="plazo_dias[${i}]" value="${plazoDefault}" min="1" class="input-table w-16 plazo-input" 
                       data-index="${i}" onchange="onPlazoChange(${i})">
            </td>
            <td class="px-2 py-1">
                <input type="date" name="fecha_vencimiento[${i}]" required class="input-table vencimiento-input" data-index="${i}"
                       onchange="onVencimientoChange(${i})">
            </td>
            <td class="px-2 py-1">
                <input type="text" class="input-table fecha-pago-display opacity-60" data-index="${i}" readonly 
                       style="background:transparent; border-color:rgba(255,255,255,0.03);">
            </td>
            <td class="px-2 py-1">
                <input type="number" step="0.01" name="importe[${i}]" value="${importePorLetra}" required class="input-table w-24 importe-input" 
                       placeholder="0.00" onchange="calcularTotalLetras()">
            </td>
            <td class="px-2 py-1">
                <input type="text" name="banco[${i}]" class="input-table" placeholder="Banco">
            </td>
            <td class="px-2 py-1">
                <input type="text" name="referencia_unica[${i}]" class="input-table" placeholder="Ref.">
            </td>
            <td class="px-2 py-1">
                <input type="text" name="observaciones[${i}]" class="input-table" placeholder="Obs.">
            </td>
            <td class="px-2 py-1 text-center">
                <button type="button" onclick="eliminarFilaLetra(this)" class="p-1.5 rounded-lg hover:bg-red-500/10 text-gray-500 hover:text-red-400 transition-colors" title="Eliminar fila">
                    <i class="fas fa-trash text-xs"></i>
                </button>
            </td>
        `;
        tbody.appendChild(tr);
    }

    // Calcular vencimientos y totales después de insertar las filas en el DOM
    for (let i = 0; i < cantidad; i++) {
        calcularVencimiento(i);
    }
    calcularTotalLetras();

    showToast('success', `${cantidad} fila(s) generada(s)`);

    // Focus en el primer campo
    setTimeout(() => {
        tbody.querySelector('input[name="numero_letra[0]"]')?.focus();
    }, 100);
}

/**
 * Calcular fecha de vencimiento basada en emisión + plazo
 */
function calcularVencimiento(index) {
    const fechaEmision = document.querySelector(`input[name="fecha_emision[${index}]"]`)?.value;
    const plazoDias = parseInt(document.querySelector(`input[name="plazo_dias[${index}]"]`)?.value) || 0;

    if (fechaEmision && plazoDias > 0) {
        const vencimiento = addDays(fechaEmision, plazoDias);
        const inputVenc = document.querySelector(`input[name="fecha_vencimiento[${index}]"]`);
        if (inputVenc) {
            inputVenc.value = vencimiento;
            calcularFechaPago(index);
        }
    }
}

/**
 * Al cambiar el plazo de una fila, recalcular los plazos de las filas siguientes
 * manteniendo el mismo intervalo entre ellas.
 */
function onPlazoChange(changedIndex) {
    // Primero recalcular el vencimiento de la fila cambiada
    calcularVencimiento(changedIndex);

    // Obtener todas las filas de letras
    const filas = document.querySelectorAll('#letras-tbody .fila-letra');
    const totalFilas = filas.length;

    if (changedIndex >= totalFilas - 1) return; // Es la última fila, no hay nada que propagar

    // Obtener el plazo actual de la fila cambiada
    const plazoActual = parseInt(document.querySelector(`input[name="plazo_dias[${changedIndex}]"]`)?.value) || 0;

    // Calcular el intervalo original entre la fila cambiada y la siguiente
    const plazoSiguiente = parseInt(document.querySelector(`input[name="plazo_dias[${changedIndex + 1}]"]`)?.value) || 0;
    // Obtener el intervalo que existía antes entre filas consecutivas (usar 5 como default)
    let intervalo = 5;
    if (changedIndex + 2 < totalFilas) {
        const plazoSig2 = parseInt(document.querySelector(`input[name="plazo_dias[${changedIndex + 2}]"]`)?.value) || 0;
        if (plazoSig2 > plazoSiguiente) {
            intervalo = plazoSig2 - plazoSiguiente;
        }
    } else if (plazoSiguiente > plazoActual) {
        // Solo 2 filas involucradas: usar la diferencia previa como intervalo
        // Pero ya que el plazoActual cambió, necesitamos el intervalo original
        // Usamos un default de 5
    }

    // Propagar plazos escalonados a las filas siguientes
    for (let i = changedIndex + 1; i < totalFilas; i++) {
        const nuevoPlazo = plazoActual + (intervalo * (i - changedIndex));
        const inputPlazo = document.querySelector(`input[name="plazo_dias[${i}]"]`);
        if (inputPlazo) {
            inputPlazo.value = nuevoPlazo;
            calcularVencimiento(i);
        }
    }
}

/**
 * Eliminar una fila de letra y reindexar las restantes
 */
function eliminarFilaLetra(button) {
    const fila = button.closest('tr');
    const tbody = document.getElementById('letras-tbody');
    const filasActuales = tbody.querySelectorAll('.fila-letra').length;

    if (filasActuales <= 1) {
        showToast('warning', 'Debe haber al menos una letra');
        return;
    }

    fila.remove();
    reindexarFilasLetras();
}

/**
 * Reindexar todas las filas después de eliminar una:
 * - Renumerar #, numero_letra
 * - Recalcular names de inputs (indices consecutivos)
 * - Recalcular importe por letra según importe factura
 * - Actualizar cantidad_letras_hidden
 */
function reindexarFilasLetras() {
    const tbody = document.getElementById('letras-tbody');
    const filas = tbody.querySelectorAll('.fila-letra');
    const cantidad = filas.length;

    // Actualizar hidden
    document.getElementById('cantidad_letras_hidden').value = cantidad;

    // Obtener importe factura para redistribuir
    const importeFactura = parseFloat(document.querySelector('input[name="importe_factura"]')?.value) || 0;
    const importePorLetra = cantidad > 0 ? (importeFactura / cantidad).toFixed(2) : 0;

    filas.forEach((tr, i) => {
        // Actualizar número visual
        tr.querySelector('.fila-numero').textContent = i + 1;

        // Renumerar numero_letra
        const numeroLetra = String(i + 1).padStart(3, '0');

        // Reindexar todos los inputs/selects con name que tiene [old_index]
        const inputs = tr.querySelectorAll('input[name], select[name]');
        inputs.forEach(input => {
            const name = input.getAttribute('name');
            const newName = name.replace(/\[\d+\]/, `[${i}]`);
            input.setAttribute('name', newName);

            // Actualizar numero_letra value
            if (newName.startsWith('numero_letra')) {
                input.value = numeroLetra;
            }

            // Actualizar importe
            if (newName.startsWith('importe')) {
                input.value = importePorLetra;
            }
        });

        // Actualizar data-index en inputs con data-index
        tr.querySelectorAll('[data-index]').forEach(el => {
            el.setAttribute('data-index', i);
        });

        // Actualizar onchange handlers de fecha_emision
        const fechaEmision = tr.querySelector(`input[name="fecha_emision[${i}]"]`);
        if (fechaEmision) fechaEmision.setAttribute('onchange', `calcularVencimiento(${i})`);

        // Actualizar onchange de plazo_dias
        const plazoDias = tr.querySelector(`input[name="plazo_dias[${i}]"]`);
        if (plazoDias) plazoDias.setAttribute('onchange', `onPlazoChange(${i})`);

        // Actualizar onchange de fecha_vencimiento
        const fechaVenc = tr.querySelector(`input[name="fecha_vencimiento[${i}]"]`);
        if (fechaVenc) fechaVenc.setAttribute('onchange', `onVencimientoChange(${i})`);

        // Actualizar onchange de importe
        const importeInput = tr.querySelector(`input[name="importe[${i}]"]`);
        if (importeInput) importeInput.setAttribute('onchange', `calcularTotalLetras()`);

        // Actualizar onclick del botón eliminar
        const btnEliminar = tr.querySelector('button[onclick*="eliminarFilaLetra"]');
        if (btnEliminar) btnEliminar.setAttribute('onclick', `eliminarFilaLetra(this)`);
    });

    calcularTotalLetras();
    showToast('info', `${cantidad} letra(s) restante(s)`);
}

/**
 * Calcular y mostrar fecha de pago (+8 días)
 */
function calcularFechaPago(index) {
    const fechaVencimiento = document.querySelector(`input[name="fecha_vencimiento[${index}]"]`)?.value;
    const display = document.querySelector(`.fecha-pago-display[data-index="${index}"]`);

    if (fechaVencimiento && display) {
        const fechaPago = addDays(fechaVencimiento, 8);
        display.value = formatDate(fechaPago);
    }
}

/**
 * Al cambiar la fecha de vencimiento manualmente, recalcular el plazo de días
 * y luego propagar (cascada) a las filas siguientes.
 */
function onVencimientoChange(index) {
    const fechaEmisionStr = document.querySelector(`input[name="fecha_emision[${index}]"]`)?.value;
    const fechaVencimientoStr = document.querySelector(`input[name="fecha_vencimiento[${index}]"]`)?.value;

    if (fechaEmisionStr && fechaVencimientoStr) {
        const dEmision = new Date(fechaEmisionStr + 'T00:00:00');
        const dVencimiento = new Date(fechaVencimientoStr + 'T00:00:00');
        
        const diffTime = dVencimiento - dEmision;
        const diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24));
        
        const inputPlazo = document.querySelector(`input[name="plazo_dias[${index}]"]`);
        if (inputPlazo) {
            inputPlazo.value = diffDays;
            // Propagar el nuevo plazo a las siguientes filas
            onPlazoChange(index);
            return;
        }
    }
    
    // Si algo falla, al menos calcular la fecha de pago
    calcularFechaPago(index);
}

/**
 * Calcular total de importes de letras
 */
function calcularTotalLetras() {
    const importes = document.querySelectorAll('.importe-input');
    let total = 0;
    importes.forEach(input => {
        total += parseFloat(input.value) || 0;
    });

    const moneda = document.getElementById('moneda_grupo')?.value || 'USD';
    const prefix = moneda === 'USD' ? '$' : 'S/';
    const totalEl = document.getElementById('total-letras');
    if (totalEl) {
        totalEl.textContent = prefix + total.toLocaleString('en-US', {
            minimumFractionDigits: 2,
            maximumFractionDigits: 2,
        });
    }
}

/**
 * Cambiar estado de una letra vía AJAX
 * Si el estado es 'renovada', abre el modal de renovación
 */
function cambiarEstado(letraId, nuevoEstado) {
    // Interceptar estado "renovada" para abrir modal de renovación
    if (nuevoEstado === 'renovada') {
        abrirModalRenovacion(letraId);
        return;
    }

    Swal.fire({
        title: '¿Cambiar estado?',
        text: `¿Desea cambiar el estado a "${nuevoEstado}"?`,
        icon: 'question',
        showCancelButton: true,
        confirmButtonColor: '#3d5af5',
        cancelButtonColor: '#64748b',
        confirmButtonText: 'Sí, cambiar',
        cancelButtonText: 'Cancelar',
        background: 'rgba(30, 42, 58, 0.98)',
        color: '#fff',
        customClass: { popup: 'swal-glass' }
    }).then((result) => {
        if (result.isConfirmed) {
            const formData = new FormData();
            formData.append('id', letraId);
            formData.append('estado', nuevoEstado);

            fetch(BASE_URL + '?c=letras&a=cambiarestado', {
                method: 'POST',
                body: formData,
            })
                .then(res => res.json())
                .then(data => {
                    if (data.error) {
                        showToast('error', data.mensaje);
                    } else {
                        showToast('success', 'Estado actualizado');
                        // Recargar para actualizar estilos
                        setTimeout(() => location.reload(), 800);
                    }
                })
                .catch(() => {
                    showToast('error', 'Error de conexión');
                });
        } else {
            // Revert select
            location.reload();
        }
    });
}

/**
 * Abrir modal SweetAlert2 de renovación de letra
 */
function abrirModalRenovacion(letraId) {
    // Buscar datos de la fila en la tabla
    const row = document.querySelector(`select[onchange*="cambiarEstado(${letraId}"]`)?.closest('tr');
    let importeActual = 0;
    let moneda = 'USD';
    let numeroLetra = '';

    if (row) {
        const cells = row.querySelectorAll('td');
        numeroLetra = cells[2]?.textContent?.trim() || '';
        moneda = cells[4]?.textContent?.trim() || 'USD';
        const importeText = cells[8]?.textContent?.trim().replace(/[^0-9.,]/g, '').replace(',', '') || '0';
        importeActual = parseFloat(importeText) || 0;
    }

    const simbolo = moneda === 'USD' ? '$' : 'S/';

    Swal.fire({
        title: '<i class="fas fa-sync-alt" style="color:#10b981;margin-right:8px;"></i> Renovar Letra',
        html: `
            <div style="text-align:left; font-family:Inter,sans-serif;">
                <div style="background:rgba(255,255,255,0.05); border:1px solid rgba(255,255,255,0.1); border-radius:12px; padding:14px; margin-bottom:16px;">
                    <div style="display:flex; justify-content:space-between; margin-bottom:6px;">
                        <span style="color:#94a3b8; font-size:12px;">Letra</span>
                        <span style="color:#fff; font-size:13px; font-weight:600; font-family:monospace;">#${numeroLetra}</span>
                    </div>
                    <div style="display:flex; justify-content:space-between;">
                        <span style="color:#94a3b8; font-size:12px;">Importe Actual</span>
                        <span style="color:#fff; font-size:13px; font-weight:700;">${simbolo}${importeActual.toFixed(2)}</span>
                    </div>
                </div>

                <label style="display:block; color:#94a3b8; font-size:12px; margin-bottom:6px; font-weight:500;">Porcentaje a Abonar (%)</label>
                <input type="number" id="swal-porcentaje" value="50" min="0" max="99" step="1"
                       style="width:100%; padding:10px 14px; background:rgba(255,255,255,0.05); border:1px solid rgba(255,255,255,0.12); border-radius:10px; color:#fff; font-size:14px; outline:none; margin-bottom:4px;"
                       oninput="actualizarPreviewRenovacion(${importeActual}, '${simbolo}')">
                <p style="color:#6b7280; font-size:11px; margin-bottom:14px;">Abono: <span id="swal-abono" style="color:#10b981; font-weight:600;">${simbolo}${(importeActual * 0.5).toFixed(2)}</span></p>

                <label style="display:block; color:#94a3b8; font-size:12px; margin-bottom:6px; font-weight:500;">Nuevo Plazo (Días después del vencimiento)</label>
                <select id="swal-plazo"
                        style="width:100%; padding:10px 14px; background:rgba(255,255,255,0.05); border:1px solid rgba(255,255,255,0.12); border-radius:10px; color:#fff; font-size:14px; outline:none; margin-bottom:16px;">
                    <option value="7">7 Días</option>
                    <option value="15">15 Días</option>
                    <option value="30" selected>30 Días</option>
                    <option value="45">45 Días</option>
                    <option value="60">60 Días</option>
                </select>

                <div style="background:rgba(61,90,245,0.1); border:1px solid rgba(61,90,245,0.25); border-radius:12px; padding:16px; text-align:center;">
                    <p style="color:#94a3b8; font-size:12px; margin-bottom:4px;">Nuevo Importe de la Letra</p>
                    <p id="swal-nuevo-importe" style="color:#6384fc; font-size:24px; font-weight:700; font-family:Sora,sans-serif;">${simbolo}${(importeActual * 0.5).toFixed(2)}</p>
                </div>
            </div>
        `,
        showCancelButton: true,
        confirmButtonColor: '#10b981',
        cancelButtonColor: '#64748b',
        confirmButtonText: '<i class="fas fa-check"></i> Procesar Renovación',
        cancelButtonText: 'Cancelar',
        background: 'rgba(30, 42, 58, 0.98)',
        color: '#fff',
        width: '420px',
        customClass: { popup: 'swal-glass' },
        preConfirm: () => {
            const porcentaje = parseFloat(document.getElementById('swal-porcentaje').value);
            const plazo = parseInt(document.getElementById('swal-plazo').value);

            if (isNaN(porcentaje) || porcentaje < 0 || porcentaje >= 100) {
                Swal.showValidationMessage('El porcentaje debe ser entre 0 y 99%');
                return false;
            }
            if (!plazo) {
                Swal.showValidationMessage('Seleccione un plazo válido');
                return false;
            }
            return { porcentaje, plazo };
        },
    }).then((result) => {
        if (result.isConfirmed) {
            // Enviar renovación vía formulario hidden
            const form = document.getElementById('form-renovar');
            document.getElementById('renovar-id').value = letraId;
            document.getElementById('renovar-porcentaje').value = result.value.porcentaje;
            document.getElementById('renovar-plazo').value = result.value.plazo;
            form.submit();
        } else {
            location.reload();
        }
    });
}

/**
 * Actualizar preview de renovación en el modal
 */
function actualizarPreviewRenovacion(importeOriginal, simbolo) {
    const porcentaje = parseFloat(document.getElementById('swal-porcentaje').value) || 0;
    if (porcentaje >= 0 && porcentaje < 100) {
        const abono = (importeOriginal * porcentaje) / 100;
        const nuevo = importeOriginal - abono;
        document.getElementById('swal-abono').textContent = simbolo + abono.toFixed(2);
        document.getElementById('swal-nuevo-importe').textContent = simbolo + nuevo.toFixed(2);
    }
}

/**
 * Confirmar eliminación de letra
 */
function confirmarEliminar(letraId, numeroLetra) {
    Swal.fire({
        title: '¿Eliminar letra?',
        html: `Se eliminará permanentemente la letra <strong>#${numeroLetra}</strong>`,
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#ef4444',
        cancelButtonColor: '#64748b',
        confirmButtonText: 'Sí, eliminar',
        cancelButtonText: 'Cancelar',
        background: 'rgba(30, 42, 58, 0.98)',
        color: '#fff',
        customClass: { popup: 'swal-glass' }
    }).then((result) => {
        if (result.isConfirmed) {
            document.getElementById('delete-id').value = letraId;
            document.getElementById('form-eliminar').submit();
        }
    });
}

/**
 * Abre el modal global de nueva empresa y la añade al select activo
 */
function crearEmpresaDesdeLetras() {
    abrirModalNuevaEmpresa((empresa) => {
        const selectEl = document.getElementById('empresa_id');
        if (selectEl && selectEl.tomselect) {
            const tom = selectEl.tomselect;
            const optionText = `${empresa.razon_social} ${empresa.ruc ? '- RUC: ' + empresa.ruc : ''}`;
            tom.addOption({ value: empresa.id, text: optionText });
            tom.addItem(empresa.id);
        } else {
            // Fallback
            location.reload();
        }
    });
}

