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

CuentasBancarias.init({
    title: 'Cuentas Bancarias',
    icon: 'fa-piggy-bank',
    idSingular: 'Cuenta Bancaria',
    idField: 'id_cuenta',
    endpoint: '/cuentas-bancarias',
    sortDefault: 'nombre_banco',
    limite: 50,
    searchPlaceholder: 'Buscar por número, alias o banco...',
    filtroEstado: true,
    showEstado: true,
    exportFileName: 'CuentasBancarias',
    elementId: 'pageCuentasBancarias',
    menuPage: 'CuentasBancarias',
    columns: [
        { field: 'nombre_banco', label: 'Banco', sortable: true, filterable: true },
        { field: 'tipo_cuenta', label: 'Tipo', sortable: true, filterable: true, width: '100px' },
        { field: 'moneda', label: 'Mon', sortable: true, filterable: true, width: '60px',
            filterOptions: [
                { valor: 'S', texto: 'S/ Soles' },
                { valor: 'D', texto: '$ Dólares' }
            ],
            render: function(row) {
                return row.moneda === 'D' ? '$' : 'S/';
            }
        },
        { field: 'numero_cuenta', label: 'N\u00FAmero Cuenta', sortable: true, filterable: true, width: '160px' },
        { field: 'alias', label: 'Alias', sortable: true, filterable: true },
        { field: 'saldo_actual', label: 'Saldo Actual', sortable: true, filterable: true, filterType: 'range', width: '130px',
            render: function(row) {
                var s = parseFloat(row.saldo_actual || 0).toFixed(2);
                var mon = row.moneda === 'D' ? '$' : 'S/';
                return mon + ' ' + s.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            }
        },
        { 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 bancos = this._bancosOptions || [];
        var bancosHtml = '<option value="">Seleccione banco</option>';
        bancos.forEach(function(b) {
            var sel = data && data.id_banco == b.id_banco ? ' selected' : '';
            bancosHtml += '<option value="' + b.id_banco + '"' + sel + '>' + b.nombre + '</option>';
        });

        var tipos = ['CORRIENTE', 'AHORRO', 'CTS', 'PLAZO_FIJO'];
        var tiposHtml = '';
        tipos.forEach(function(t) {
            var sel = data && data.tipo_cuenta === t ? ' selected' : '';
            tiposHtml += '<option value="' + t + '"' + sel + '>' + t + '</option>';
        });

        var html = '<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">';
        html += '<div class="prov-field"><label>Banco <span class="req">*</span></label><select id="cbFormBanco" class="prov-input" required>' + bancosHtml + '</select></div>';
        html += '<div class="prov-field"><label>Tipo Cuenta <span class="req">*</span></label><select id="cbFormTipo" class="prov-input" required>' + tiposHtml + '</select></div>';
        html += '<div class="prov-field"><label>Moneda <span class="req">*</span></label><select id="cbFormMoneda" class="prov-input" required>';
        html += '<option value="S"' + (data && data.moneda === 'S' ? ' selected' : '') + '>S/ Soles</option>';
        html += '<option value="D"' + (data && data.moneda === 'D' ? ' selected' : '') + '>$ Dólares</option>';
        html += '</select></div>';
        html += '<div class="prov-field"><label>Número de Cuenta <span class="req">*</span></label><input type="text" id="cbFormNumero" class="prov-input" maxlength="50" required></div>';
        html += '<div class="prov-field"><label>CCI</label><input type="text" id="cbFormCci" class="prov-input" maxlength="30"></div>';
        html += '<div class="prov-field"><label>Alias</label><input type="text" id="cbFormAlias" class="prov-input" maxlength="100"></div>';
        html += '<div class="prov-field"><label>Cuenta Contable</label><input type="text" id="cbFormCtaCte" class="prov-input" maxlength="20"></div>';
        html += '<div class="prov-field"><label>Saldo Inicial</label><input type="number" id="cbFormSaldoIni" class="prov-input" step="0.01" min="0"></div>';
        html += '<div class="prov-field"><label>Saldo Actual</label><input type="number" id="cbFormSaldoAct" class="prov-input" step="0.01" min="0"></div>';
        html += '<div class="prov-field"><label>Fecha Apertura</label><input type="date" id="cbFormFechaApe" class="prov-input"></div>';
        html += '<div class="prov-field"><label>Estado</label><select id="cbFormEstado" 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('cbFormBanco').value = '';
            document.getElementById('cbFormTipo').value = 'CORRIENTE';
            document.getElementById('cbFormMoneda').value = 'S';
            document.getElementById('cbFormNumero').value = '';
            document.getElementById('cbFormCci').value = '';
            document.getElementById('cbFormAlias').value = '';
            document.getElementById('cbFormCtaCte').value = '';
            document.getElementById('cbFormSaldoIni').value = '';
            document.getElementById('cbFormSaldoAct').value = '';
            document.getElementById('cbFormFechaApe').value = '';
            document.getElementById('cbFormEstado').value = '1';
            return;
        }
        document.getElementById('cbFormBanco').value = data.id_banco || '';
        document.getElementById('cbFormTipo').value = data.tipo_cuenta || 'CORRIENTE';
        document.getElementById('cbFormMoneda').value = data.moneda || 'S';
        document.getElementById('cbFormNumero').value = data.numero_cuenta || '';
        document.getElementById('cbFormCci').value = data.cci || '';
        document.getElementById('cbFormAlias').value = data.alias || '';
        document.getElementById('cbFormCtaCte').value = data.cuenta_contable || '';
        document.getElementById('cbFormSaldoIni').value = data.saldo_inicial || '';
        document.getElementById('cbFormSaldoAct').value = data.saldo_actual || '';
        document.getElementById('cbFormFechaApe').value = data.fecha_apertura ? data.fecha_apertura.split('T')[0] : '';
        document.getElementById('cbFormEstado').value = data.estado ? '1' : '0';
    },
    onGuardar: function() {
        var id = document.getElementById('pageCuentasBancariasFormId')?.value;
        var banco = parseInt(document.getElementById('cbFormBanco').value);
        var tipo = document.getElementById('cbFormTipo').value;
        var moneda = document.getElementById('cbFormMoneda').value;
        var numero = document.getElementById('cbFormNumero').value.trim();
        var cci = document.getElementById('cbFormCci').value.trim();
        var alias = document.getElementById('cbFormAlias').value.trim().toUpperCase();
        var ctaCte = document.getElementById('cbFormCtaCte').value.trim();
        var saldoIni = parseFloat(document.getElementById('cbFormSaldoIni').value) || 0;
        var saldoAct = parseFloat(document.getElementById('cbFormSaldoAct').value);
        var fechaApe = document.getElementById('cbFormFechaApe').value || null;
        var est = document.getElementById('cbFormEstado').value === '1';

        if (!banco) { Mensaje.error({ titulo: 'Validación', texto: 'El banco es requerido' }); return; }
        if (!numero) { Mensaje.error({ titulo: 'Validación', texto: 'El número de cuenta es requerido' }); return; }

        var body = {
            id_empresa: this.sesion.id_empresa,
            id_sucursal: this.sesion.id_sucursal || null,
            id_banco: banco,
            tipo_cuenta: tipo,
            moneda: moneda,
            numero_cuenta: numero,
            cci: cci || null,
            alias: alias || null,
            cuenta_contable: ctaCte || null,
            saldo_inicial: saldoIni,
            saldo_actual: isNaN(saldoAct) ? saldoIni : saldoAct,
            fecha_apertura: fechaApe,
            usuario_creacion: id ? undefined : (this.sesion.nombre_completo || this.sesion.usuario || 'SISTEMA'),
            usuario_modificacion: id ? (this.sesion.nombre_completo || this.sesion.usuario || 'SISTEMA') : undefined,
            estado: est
        };

        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(body)
        })
        .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 cuenta bancaria' });
        });
    }
});

// Cargar combos de bancos al abrir formulario
CuentasBancarias._cargarBancos = function(callback) {
    var self = this;
    var url = this.API_URL + '/bancos?id_empresa=' + this.sesion.id_empresa + '&estado=1&limit=0';
    if (this.sesion.id_sucursal) url += '&id_sucursal=' + this.sesion.id_sucursal;

    fetch(url)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                self._bancosOptions = res.data;
            }
            if (callback) callback();
        })
        .catch(function() {
            self._bancosOptions = [];
            if (callback) callback();
        });
};

// Override abrirModal to load bancos first
var _abrirModalOriginalCB = CuentasBancarias.abrirModal;
CuentasBancarias.abrirModal = function(data) {
    var self = this;
    this._cargarBancos(function() {
        _abrirModalOriginalCB.call(self, data);
    });
};
