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

CorrelativosDocumentos.init({
    title: 'Numeración de Documentos',
    icon: 'fa-sort-numeric-up',
    idSingular: 'Correlativo',
    idField: 'id_correlativo',
    endpoint: '/correlativos-documentos',
    sortDefault: 'td.codigo',
    limite: 50,
    searchPlaceholder: 'Buscar por tipo doc o serie...',
    filtroEstado: false,
    showEstado: false,
    exportFileName: 'CorrelativosDocumentos',
    elementId: 'pageCorrelativosDocumentos',
    menuPage: 'CorrelativosDocumentos',
    columns: [
        { field: 'tipo_doc_codigo', label: 'Cód.', sortable: true, filterable: true, width: '60px' },
        { field: 'tipo_doc_nombre', label: 'Tipo Documento', sortable: true, filterable: true },
        { field: 'serie', label: 'Serie', sortable: true, filterable: true, width: '80px' },
        { field: 'numero_actual', label: 'N° Actual', sortable: true, filterable: true, width: '100px',
            render: function(row) { return String(row.numero_actual); }
        },
        { field: 'usuario_nombre', label: 'Asignado a', sortable: false, filterable: true, width: '130px',
            render: function(row) { return row.usuario_nombre || '(Todos)'; }
        }
    ],
    renderFormulario: function(data) {
        var sesion = CorrelativosDocumentos.sesion;
        var html = '<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">';
        html += '<div class="prov-field"><label>Tipo Documento <span class="req">*</span></label><select id="cdFormTipoDoc" class="prov-input" required><option value="">Seleccione...</option></select></div>';
        html += '<div class="prov-field"><label>Serie <span class="req">*</span></label><input type="text" id="cdFormSerie" class="prov-input" maxlength="4" required placeholder="Ej: F001"></div>';
        html += '<div class="prov-field"><label>N° Actual</label><input type="text" id="cdFormNumeroActual" class="prov-input" inputmode="numeric" maxlength="7" oninput="this.value=this.value.replace(/[^0-9]/g,\'\')"></div>';
        html += '<div class="prov-field"><label>Asignado a (usuario)</label><select id="cdFormUsuario" class="prov-input"><option value="">Seleccione...</option></select></div>';
        if (sesion) {
            html += '<input type="hidden" id="cdFormIdEmpresa" value="' + (sesion.id_empresa || '') + '">';
        }
        html += '</div>';
        return html;
    },
    onCargarFormulario: function(data) {
        var self = this;
        var selDoc = document.getElementById('cdFormTipoDoc');
        var selUsr = document.getElementById('cdFormUsuario');

        if (selDoc && selDoc.options.length <= 1) {
            fetch(self.API_URL + '/sunat-tipos-doc/activos?id_empresa=' + (self.sesion ? self.sesion.id_empresa : ''))
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok && res.data) {
                        res.data.forEach(function(td) {
                            var opt = document.createElement('option');
                            opt.value = td.id_tipo_doc;
                            opt.textContent = td.codigo + ' - ' + td.nombre;
                            selDoc.appendChild(opt);
                        });
                        if (data) selDoc.value = data.id_tipo_doc;
                    }
                });
        }

        if (selUsr && selUsr.options.length <= 1) {
            fetch(self.API_URL + '/usuarios?id_empresa=' + (self.sesion ? self.sesion.id_empresa : ''))
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok && res.data) {
                        res.data.forEach(function(u) {
                            var opt = document.createElement('option');
                            opt.value = u.id_usuario;
                            opt.textContent = u.usuario + (u.nombre_completo ? ' - ' + u.nombre_completo : '');
                            selUsr.appendChild(opt);
                        });
                        if (data && data.id_usuario) selUsr.value = data.id_usuario;
                    }
                });
        }

        if (!data) {
            if (document.getElementById('cdFormSerie')) document.getElementById('cdFormSerie').value = '';
            if (document.getElementById('cdFormNumeroActual')) document.getElementById('cdFormNumeroActual').value = '';
            if (selUsr) selUsr.value = '';
            return;
        }
        if (selDoc) selDoc.value = data.id_tipo_doc;
        if (document.getElementById('cdFormSerie')) document.getElementById('cdFormSerie').value = data.serie || '';
        if (document.getElementById('cdFormNumeroActual')) document.getElementById('cdFormNumeroActual').value = data.numero_actual || '';
        if (selUsr && data.id_usuario) selUsr.value = data.id_usuario;
    },
    onGuardar: function() {
        var id = document.getElementById('pageCorrelativosDocumentosFormId')?.value;
        var idTipoDoc = parseInt(document.getElementById('cdFormTipoDoc').value);
        var serie = document.getElementById('cdFormSerie').value.trim().toUpperCase();
        var numeroActual = document.getElementById('cdFormNumeroActual').value;
        var idEmpresa = parseInt(document.getElementById('cdFormIdEmpresa')?.value) || 0;
        var idUsuario = parseInt(document.getElementById('cdFormUsuario').value) || null;

        if (!idTipoDoc) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione un tipo de documento' }); return; }
        if (!serie) { Mensaje.error({ titulo: 'Validación', texto: 'La serie es requerida' }); return; }
        if (!idEmpresa) { Mensaje.error({ titulo: 'Validación', texto: 'No se encontró la empresa de la sesión' }); return; }
        if (!numeroActual || numeroActual === '0') { Mensaje.error({ titulo: 'Validación', texto: 'El número actual no puede ser 0' }); 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_tipo_doc: idTipoDoc, id_empresa: idEmpresa, id_sucursal: this.sesion ? this.sesion.id_sucursal || null : null, serie: serie, numero_actual: numeroActual, id_usuario: idUsuario })
        })
        .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 correlativo' });
        });
    }
});
