var FormasPago = Object.assign({}, TablaGenerica);

FormasPago.cargarCondiciones = function(selId, valorSeleccionado) {
    var sel = document.getElementById(selId);
    if (!sel) return;
    if (sel.dataset._cargado && !arguments[1]) return;
    fetch(FormasPago.API_URL + '/condiciones-pago?limit=100&estado=1&id_empresa=' + (FormasPago.sesion ? FormasPago.sesion.id_empresa : ''))
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok && res.data) {
                sel.innerHTML = '<option value="">Seleccione...</option>';
                res.data.forEach(function(item) {
                    sel.innerHTML += '<option value="' + item.id_condicion + '">' + item.nombre + '</option>';
                });
                sel.dataset._cargado = '1';
                if (valorSeleccionado) sel.value = valorSeleccionado;
            }
        });
};

FormasPago.generarSiguienteCodigo = function(idCondicion) {
    if (!idCondicion) return;
    var idEmp = FormasPago.sesion ? FormasPago.sesion.id_empresa : '';
    fetch(FormasPago.API_URL + '/formas-pago/next/' + idCondicion + '?id_empresa=' + idEmp)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                document.getElementById('fpFormCodigo').value = res.data.cod_fpa;
            }
        });
};

FormasPago.init({
    title: 'Formas de Pago',
    icon: 'fa-credit-card',
    idSingular: 'Forma de Pago',
    idField: 'id_forma_pago',
    endpoint: '/formas-pago',
    sortDefault: 'cod_fpa',
    limite: 50,
    searchPlaceholder: 'Buscar por código o nombre...',
    filtroEstado: true,
    showEstado: true,
    showAcciones: true,
    exportFileName: 'FormasPago',
    elementId: 'pageFormasPago',
    menuPage: 'FormasPago',
    columns: [
        { field: 'cod_fpa', label: 'Código', sortable: true, filterable: true, width: '80px' },
        { field: 'condicion_nombre', label: 'Condición', sortable: true, filterable: true, width: '25%' },
        { field: 'nom_fpa', label: 'Nombre', sortable: true, filterable: true },
        { field: 'dia_fpa', label: 'Días', sortable: true, filterable: false, width: '70px',
            render: function(row) { return row.dia_fpa || '0'; }
        },
        { field: 'estado', label: 'Estado', sortable: true, filterable: true, width: '100px',
            render: function(row) {
                return row.estado
                    ? '<span class="prov-badge prov-badge-activo"><span class="prov-badge-dot"></span>Activo</span>'
                    : '<span class="prov-badge prov-badge-inactivo"><span class="prov-badge-dot"></span>Inactivo</span>';
            }
        }
    ],
    renderFormulario: function(data) {
        var html = '<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">';
        html += '<div class="prov-field"><label>Condición de Pago <span class="req">*</span></label><select id="fpFormCondicion" class="prov-input"><option value="">Seleccione...</option></select></div>';
        html += '<div class="prov-field"><label>Código <span class="req">*</span></label><input type="text" id="fpFormCodigo" class="prov-input" maxlength="3" readonly></div>';
        html += '<div class="prov-field"><label>Nombre <span class="req">*</span></label><input type="text" id="fpFormNombre" class="prov-input" maxlength="35" required></div>';
        html += '<div class="prov-field"><label>Días</label><input type="number" id="fpFormDias" class="prov-input" min="0" value="0"></div>';
        html += '<div class="prov-field"><label>Estado</label><select id="fpFormEstado" class="prov-input"><option value="1">Activo</option><option value="0">Inactivo</option></select></div>';
        html += '</div>';
        return html;
    },
    onCargarFormulario: function(data) {
        if (!data) {
            document.getElementById('fpFormCodigo').value = '';
            document.getElementById('fpFormNombre').value = '';
            document.getElementById('fpFormDias').value = '0';
            document.getElementById('fpFormEstado').value = '1';
            FormasPago.cargarCondiciones('fpFormCondicion');
            return;
        }
        document.getElementById('fpFormCodigo').value = data.cod_fpa || '';
        document.getElementById('fpFormNombre').value = data.nom_fpa || '';
        document.getElementById('fpFormDias').value = data.dia_fpa || '0';
        document.getElementById('fpFormEstado').value = data.estado ? '1' : '0';
        FormasPago.cargarCondiciones('fpFormCondicion', data.id_condicion);
    },
    onGuardar: function() {
        var id = document.getElementById('pageFormasPagoFormId')?.value;
        var idCondicion = parseInt(document.getElementById('fpFormCondicion').value);
        var codFpa = document.getElementById('fpFormCodigo').value.trim();
        var nomFpa = document.getElementById('fpFormNombre').value.trim().toUpperCase();
        var diaFpa = parseInt(document.getElementById('fpFormDias').value) || 0;
        var est = document.getElementById('fpFormEstado').value === '1';

        if (!idCondicion) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione una condición de pago' }); return; }
        if (!codFpa) { Mensaje.error({ titulo: 'Validación', texto: 'El código es requerido' }); return; }
        if (!nomFpa) { Mensaje.error({ titulo: 'Validación', texto: 'El nombre es requerido' }); return; }

        var metodo = id ? 'PUT' : 'POST';
        var url = this.API_URL + this.endpoint + (id ? '/' + id : '');

        fetch(url, {
            method: metodo,
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                id_empresa: this.sesion.id_empresa,
                id_sucursal: this.sesion.id_sucursal || null,
                id_condicion: idCondicion,
                cod_fpa: codFpa,
                nom_fpa: nomFpa,
                dia_fpa: diaFpa,
                estado: est
            })
        })
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                Mensaje.exito({ titulo: 'Guardado', texto: res.mensaje });
                Modal.cerrar();
                this.paginaActual = 1;
                this.cargarTabla();
            } else {
                Mensaje.error({ titulo: 'Error', texto: res.mensaje });
            }
        }.bind(this))
        .catch(function() {
            Mensaje.error({ titulo: 'Error', texto: 'Error al guardar forma de pago' });
        });
    }
});

document.addEventListener('change', function(e) {
    if (e.target.id === 'fpFormCondicion' && e.target.value) {
        var codInput = document.getElementById('fpFormCodigo');
        if (codInput && !codInput.value) {
            FormasPago.generarSiguienteCodigo(e.target.value);
        }
    }
});

var _fpVerDetalle = FormasPago.verDetalle;
FormasPago.verDetalle = async function(id) {
    var self = this;
    try {
        var res = await fetch(this.API_URL + this.endpoint + '/' + id + '?id_empresa=' + (this.sesion ? this.sesion.id_empresa : ''));
        var data = await res.json();
        if (!data.ok) return;

        var html = '<div class="prov-detalle">';
        this.columns.forEach(function(col) {
            var val = data.data[col.field];
            if (col.render) val = col.render(data.data, val);
            else val = (val !== null && val !== undefined) ? String(val) : '-';
            html += '<div class="prov-detalle-row"><span class="prov-detalle-label">' + col.label + ':</span><span class="prov-detalle-valor">' + val + '</span></div>';
        });
        html += '</div>';

        Modal.abrir({
            titulo: 'Detalle de ' + this.idSingular,
            ancho: '500px',
            contenido: html,
            botones: [
                {
                    texto: 'Imprimir', tipo: 'secundario', accion: function() {
                        var empresa = self.sesion && self.sesion.empresa_razon ? self.sesion.empresa_razon : '';
                        var ahora = new Date();
                        var fechaHora = ahora.toLocaleDateString('es-PE', { day: '2-digit', month: '2-digit', year: 'numeric' }) + ' ' + ahora.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });
                        var lineas = '';
                        self.columns.forEach(function(col) {
                            var val = data.data[col.field];
                            if (col.render) val = col.render(data.data, val);
                            else val = (val !== null && val !== undefined) ? String(val) : '-';
                            lineas += '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:140px;font-size:0.75rem">' + col.label + '</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + val + '</td></tr>';
                        });
                        var fullHtml = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Forma de Pago</title>' +
                            '<link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">' +
                            '<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:"Plus Jakarta Sans",sans-serif;padding:30px 40px;color:#1E293B}.header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid #1A4480}.header-left{}.empresa{font-size:0.65rem;font-weight:600;color:#475569;margin-top:2px}.titulo{font-size:1.2rem;font-weight:800;color:#1A4480;text-transform:uppercase;letter-spacing:0.5px}.fecha{font-size:0.65rem;color:#64748B;text-align:right;margin-bottom:4px}table{width:100%;border-collapse:collapse;margin-top:12px}.footer{text-align:center;font-size:0.65rem;color:#94A3B8;margin-top:20px;border-top:1px solid #E2E8F0;padding-top:8px}@page{margin:12mm}</style></head><body>' +
                            '<div class="header"><div class="header-left"><div class="titulo">Forma de Pago</div>' + (empresa ? '<div class="empresa">' + empresa + '</div>' : '') + '</div><div class="fecha">' + fechaHora + '</div></div>' +
                            '<table>' + lineas + '</table>' +
                            '<div class="footer">NexusERP</div></body></html>';
                        var oldFrame = document.getElementById('fp-print-frame');
                        if (oldFrame) document.body.removeChild(oldFrame);
                        var iframe = document.createElement('iframe');
                        iframe.id = 'fp-print-frame';
                        iframe.style.cssText = 'position:absolute;width:1px;height:1px;opacity:0.01;top:-9999px;left:-9999px';
                        iframe.srcdoc = fullHtml;
                        document.body.appendChild(iframe);
                        iframe.onload = function() {
                            setTimeout(function() {
                                try { iframe.contentWindow.print(); } catch(e) {}
                            }, 1500);
                        };
                    }
                },
                { texto: 'Cerrar', tipo: 'primario', accion: function() { Modal.cerrar(); } }
            ]
        });
    } catch (error) {
        Mensaje.error({ titulo: 'Error', texto: 'Error al cargar detalle' });
    }
};

var _fpImprimir = FormasPago.imprimir;
FormasPago.imprimir = async function() {
    var datos = await this.obtenerTodosDatos();
    if (!datos || datos.length === 0) {
        Mensaje.error({ titulo: 'Imprimir', texto: 'No hay datos para imprimir' });
        return;
    }

    var filtros = [];
    if (Object.keys(this.filtrosColumna).length > 0) {
        for (var k in this.filtrosColumna) filtros.push(k + ': ' + this.filtrosColumna[k]);
    }
    var buscarVal = document.getElementById(this.elementId + 'Buscar');
    if (buscarVal && buscarVal.value.trim()) filtros.push('búsqueda: ' + buscarVal.value.trim());
    if (this.filtroEstado && this.estadoFiltroActivo !== '1') {
        var sel = document.getElementById(this.elementId + 'FiltroEstado');
        if (sel) filtros.push('estado: ' + sel.options[sel.selectedIndex].text);
    }

    var ahora = new Date();
    var fechaHora = ahora.toLocaleDateString('es-PE', { day: '2-digit', month: '2-digit', year: 'numeric' }) +
        ' ' + ahora.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });

    var di = await TablaGenerica._obtenerDatosImpresion();

    var filasHtml = '';
    datos.forEach(function(row) {
        filasHtml += '<tr>';
        this.columns.forEach(function(col) {
            var val = row[col.field];
            if (col.render) val = col.render(row, val);
            else val = (val !== null && val !== undefined) ? String(val) : '-';
            filasHtml += '<td>' + val + '</td>';
        }, this);
        filasHtml += '</tr>';
    }, this);

    var cabecerasHtml = this.columns.map(function(c) { return '<th>' + c.label + '</th>'; }).join('');
    var tablaHtml = '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)">' + cabecerasHtml.replace(/<th>/g, '<th style="white-space:nowrap">') + '</tr></thead><tbody>' + filasHtml + '</tbody></table></div>';

    var contenido = '<div id="provPrintContent">' +
        '<div class="prov-print-header">' +
            '<div>' + di.logoHtml + '<div style="display:inline-block;vertical-align:middle">' +
                '<div class="prov-print-titulo">' + this.title + '</div>' +
                (di.empresa ? '<div class="prov-print-empresa">' + di.empresa + '</div>' : '') +
                (di.sucursal ? '<div style="font-size:0.65rem;color:#64748B;margin-top:1px">' + di.sucursal + '</div>' : '') +
            '</div></div>' +
            '<div class="prov-print-info"><div class="prov-print-fecha">' + fechaHora + '</div></div>' +
        '</div>';

    if (filtros.length > 0) {
        contenido += '<div class="prov-print-filtros">Filtros: ' + filtros.join(' | ') + '</div>';
    }

    contenido += tablaHtml +
        '<div class="prov-print-total">Total: ' + datos.length + ' registro(s)</div>' +
        '</div>';

    var fullHtml = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>' + this.title + '</title>' +
        '<link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">' +
        '<style>' +
        '*{margin:0;padding:0;box-sizing:border-box}' +
        'body{font-family:"Plus Jakarta Sans",sans-serif;padding:30px 40px;color:#1E293B}' +
        '.prov-print-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid #1A4480}' +
        '.prov-print-empresa{font-size:0.65rem;font-weight:600;color:#475569;margin-top:2px}' +
        '.prov-print-titulo{font-size:1.2rem;font-weight:800;color:#1A4480;text-transform:uppercase;letter-spacing:0.5px}' +
        '.prov-print-info{text-align:right}' +
        '.prov-print-fecha{font-size:0.65rem;color:#64748B;text-align:right;margin-bottom:4px}' +
        '.prov-print-filtros{font-size:0.72rem;color:#475569;background:#F1F5F9;padding:5px 10px;border-radius:6px;margin-bottom:14px}' +
        'table{width:100%;border-collapse:collapse;font-size:0.72rem}' +
        'thead th{background:#1A4480;color:#FFF;padding:7px 8px;text-align:left;font-weight:700;text-transform:uppercase;font-size:0.6rem;letter-spacing:0.5px;border-bottom:2px solid #0F2847;white-space:nowrap}' +
        'table tbody td{padding:5px 8px;border-bottom:1px solid #E2E8F0;color:#334155}' +
        'tbody tr:nth-child(even){background:#F8FAFC}' +
        '.prov-print-total{font-size:0.75rem;color:#1A4480;font-weight:600;margin-top:12px}' +
        '.prov-print-footer{text-align:center;font-size:0.65rem;color:#94A3B8;margin-top:20px;border-top:1px solid #E2E8F0;padding-top:8px}' +
        '@page{margin:12mm;@bottom-center{content:counter(page);font-family:"Plus Jakarta Sans",sans-serif;font-size:0.65rem;color:#94A3B8}}' +
        '<' + 'script' + '>window.onload=function(){setTimeout(function(){window.print()},800)};<' + '/' + 'script' + '>' +
        '</style></head><body>' + contenido + '<div class="prov-print-footer">NexusERP</div></body></html>';

    var oldFrame = document.getElementById('fp-print-frame');
    if (oldFrame) document.body.removeChild(oldFrame);
    var iframe = document.createElement('iframe');
    iframe.id = 'fp-print-frame';
    iframe.style.cssText = 'position:absolute;width:1px;height:1px;opacity:0.01;top:-9999px;left:-9999px';
    iframe.srcdoc = fullHtml;
    document.body.appendChild(iframe);
    iframe.onload = function() {
        setTimeout(function() {
            try { iframe.contentWindow.print(); } catch(e) {}
        }, 1500);
    };
};
