var TipoCambio = {
    API_URL: (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')
        ? 'http://localhost:3000/api'
        : 'https://api.sabha.pe/api',
    sesion: null,
    datos: [],
    seleccionado: null,
    cargando: false,

    init: function(sesion) {
        if (sesion) this.sesion = sesion;
        this.cargarPagina();
    },

    cargarPagina: function() {
        var self = this;
        var container = document.getElementById('pageTipoCambio');
        if (!container) return;

        container.innerHTML = `
            <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px">
                <div>
                    <h2 style="margin:0;font-size:20px;color:#1e293b">Tipo de Cambio</h2>
                    <p style="margin:4px 0 0;font-size:13px;color:#64748b">Mantenimiento de tipos de cambio diarios (USD/PEN)</p>
                </div>
            </div>
            <div class="tc-container">
                <div class="tc-grid-main">
                    <div class="tc-section">
                        <div class="tc-section-header">
                            <i class="fas fa-cloud-download-alt"></i> Importar desde SUNAT
                        </div>
                        <div class="tc-section-body">
                            <div id="tcResultadoImport" class="tc-resultado"></div>
                            <div class="tc-form">
                                <div class="tc-mes-anio">
                                    <div class="tc-field">
                                        <label>Mes</label>
                                        <select id="tcMes" class="tc-input">
                                            <option value="1">Enero</option><option value="2">Febrero</option>
                                            <option value="3">Marzo</option><option value="4">Abril</option>
                                            <option value="5">Mayo</option><option value="6">Junio</option>
                                            <option value="7">Julio</option><option value="8">Agosto</option>
                                            <option value="9">Setiembre</option><option value="10">Octubre</option>
                                            <option value="11">Noviembre</option><option value="12">Diciembre</option>
                                        </select>
                                    </div>
                                    <div class="tc-field">
                                        <label>Año</label>
                                        <input type="number" id="tcAnio" class="tc-input" min="2000" max="2099">
                                    </div>
                                </div>
                                <div class="tc-btn-group">
                                    <button id="tcBtnImportar" class="tc-btn tc-btn-sunat" onclick="TipoCambio.importarSunat()">
                                        <i class="fas fa-download"></i> Importar mes desde SUNAT
                                    </button>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="tc-section">
                        <div class="tc-section-header">
                            <i class="fas fa-edit"></i> Ingreso Manual
                        </div>
                        <div class="tc-section-body">
                            <div class="tc-form">
                                <div class="tc-field">
                                    <label>Fecha <span style="color:#ef4444">*</span></label>
                                    <input type="date" id="tcFormFecha" class="tc-input">
                                </div>
                                <div class="tc-form-row">
                                    <div class="tc-field">
                                        <label>Compra (USD→PEN) <span style="color:#ef4444">*</span></label>
                                        <input type="number" id="tcFormCompra" class="tc-input" step="0.0001" min="0" placeholder="0.0000">
                                    </div>
                                    <div class="tc-field">
                                        <label>Venta (USD→PEN) <span style="color:#ef4444">*</span></label>
                                        <input type="number" id="tcFormVenta" class="tc-input" step="0.0001" min="0" placeholder="0.0000">
                                    </div>
                                </div>
                                <div class="tc-btn-group">
                                    <button id="tcBtnGuardar" class="tc-btn tc-btn-success" onclick="TipoCambio.guardar()">
                                        <i class="fas fa-save"></i> Guardar
                                    </button>
                                    <button id="tcBtnActualizar" class="tc-btn tc-btn-warning" onclick="TipoCambio.actualizar()" style="display:none">
                                        <i class="fas fa-sync"></i> Actualizar
                                    </button>
                                    <button id="tcBtnCancelar" class="tc-btn tc-btn-outline" onclick="TipoCambio.cancelar()" style="display:none">
                                        <i class="fas fa-times"></i> Cancelar
                                    </button>
                                    <button class="tc-btn tc-btn-danger" onclick="TipoCambio.eliminar()">
                                        <i class="fas fa-trash"></i> Eliminar
                                    </button>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="tc-section" id="tcTablaSection" style="display:flex;flex-direction:column;flex:1;min-height:0">
                    <div class="tc-section-header">
                        <i class="fas fa-table"></i> Tipos de Cambio Registrados
                        <button class="tc-btn-print" title="Imprimir todos" onclick="TipoCambio.imprimirTodos()" style="margin-left:auto"><i class="fas fa-print"></i></button>
                    </div>
                    <div class="tc-section-body" style="padding:12px;flex:1;min-height:0;display:flex;flex-direction:column">
                        <div class="tc-filtros" style="margin-bottom:12px">
                            <div class="tc-field">
                                <label>Mes</label>
                                <select id="tcFiltroMes" class="tc-input">
                                    <option value="">Todos</option>
                                    <option value="1">Enero</option><option value="2">Febrero</option>
                                    <option value="3">Marzo</option><option value="4">Abril</option>
                                    <option value="5">Mayo</option><option value="6">Junio</option>
                                    <option value="7">Julio</option><option value="8">Agosto</option>
                                    <option value="9">Setiembre</option><option value="10">Octubre</option>
                                    <option value="11">Noviembre</option><option value="12">Diciembre</option>
                                </select>
                            </div>
                            <div class="tc-field">
                                <label>Año</label>
                                <input type="number" id="tcFiltroAnio" class="tc-input" min="2000" max="2099">
                            </div>
                            <button class="tc-btn tc-btn-primary" onclick="TipoCambio.consultar()">
                                <i class="fas fa-search"></i> Consultar
                            </button>
                            <button class="tc-btn tc-btn-outline" onclick="TipoCambio.limpiarFiltros()">
                                <i class="fas fa-eraser"></i> Limpiar
                            </button>
                        </div>
                        <div id="tcTablaContainer" class="tc-table-wrap">
                            <div class="tc-empty">
                                <i class="fas fa-exchange-alt"></i>
                                <span>Seleccione filtros y haga clic en Consultar</span>
                            </div>
                        </div>
                    </div>
                    <div class="tc-footer-bar">
                        <div id="tcFooterInfo" class="tc-footer-info"></div>
                        <div id="tcFooterPaginacion" class="tc-btn-group"></div>
                    </div>
                </div>
            </div>
        `;

        var mesActual = new Date().getMonth() + 1;
        var anioActual = new Date().getFullYear();
        document.getElementById('tcMes').value = mesActual;
        document.getElementById('tcAnio').value = anioActual;
        document.getElementById('tcFormFecha').value = anioActual + '-' + String(mesActual).padStart(2, '0') + '-' + String(new Date().getDate()).padStart(2, '0');

        document.getElementById('tcFiltroMes').value = mesActual;
        document.getElementById('tcFiltroAnio').value = anioActual;

        this.consultar();
    },

    consultar: function() {
        var self = this;
        var mes = document.getElementById('tcFiltroMes').value;
        var anio = document.getElementById('tcFiltroAnio').value;

        var params = '?id_empresa=' + (this.sesion ? this.sesion.id_empresa : '');
        if (mes && anio) {
            params += '&mes=' + mes + '&anio=' + anio;
        } else if (anio) {
            params += '&anio=' + anio;
        }

        document.getElementById('tcTablaContainer').innerHTML = '<div class="tc-loading"><i class="fas fa-spinner fa-spin"></i> Cargando...</div>';

        fetch(this.API_URL + '/tipo-cambio' + params)
            .then(function(r) {
                console.log('[TC] Response status:', r.status);
                return r.json().then(function(j) { return { status: r.status, json: j }; });
            })
            .then(function(obj) {
                var res = obj.json;
                if (obj.status >= 200 && obj.status < 300 && res.ok !== false) {
                    self.datos = res.data || res;
                    self.renderTabla(Array.isArray(self.datos) ? self.datos : [], res.total || 0);
                } else {
                    document.getElementById('tcTablaContainer').innerHTML = '<div class="tc-empty"><i class="fas fa-exclamation-triangle"></i><span>' + (res.mensaje || 'Error ' + obj.status) + '</span></div>';
                }
            })
            .catch(function(err) {
                console.error('[TC] Error en consultar:', err);
                document.getElementById('tcTablaContainer').innerHTML = '<div class="tc-empty"><i class="fas fa-exclamation-triangle"></i><span>Error de conexión</span></div>';
            });
    },

    renderTabla: function(data, total) {
        var container = document.getElementById('tcTablaContainer');
        var footerInfo = document.getElementById('tcFooterInfo');

        if (!data || data.length === 0) {
            container.innerHTML = '<div class="tc-empty"><i class="fas fa-exchange-alt"></i><span>No se encontraron registros</span></div>';
            footerInfo.textContent = '0 registros';
            return;
        }

        var html = '<table class="tc-tabla">';
        html += '<thead><tr>';
        html += '<th class="tc-col-fecha">Fecha</th>';
        html += '<th class="tc-col-compra">Compra</th>';
        html += '<th class="tc-col-venta">Venta</th>';
        html += '<th class="tc-col-fuente">Fuente</th>';
        html += '<th class="tc-col-acciones">Acciones</th>';
        html += '</tr></thead><tbody>';

        for (var i = 0; i < data.length; i++) {
            var d = data[i];
            var fecha = self_formatFecha(d.fecha);
            var fuente = d.fuente || 'MANUAL';
            var fuenteClass = fuente === 'SUNAT' ? 'tc-badge-sunat' : 'tc-badge-manual';
            var selected = this.seleccionado && this.seleccionado.fecha === d.fecha ? ' tc-selected' : '';

            html += '<tr class="' + selected + '" onclick="TipoCambio.seleccionarFila(this, ' + i + ')" ondblclick="TipoCambio.cargarFila(' + i + ')">';
            html += '<td class="tc-col-fecha">' + fecha + '</td>';
            html += '<td class="tc-col-compra">' + parseFloat(d.compra).toFixed(4) + '</td>';
            html += '<td class="tc-col-venta">' + parseFloat(d.venta).toFixed(4) + '</td>';
            html += '<td class="tc-col-fuente"><span class="tc-badge ' + fuenteClass + '">' + fuente + '</span></td>';
            html += '<td class="tc-col-acciones">';
            html += '<button class="tc-btn-print" title="Imprimir" onclick="event.stopPropagation();TipoCambio.imprimirFila(' + i + ')"><i class="fas fa-print"></i></button> ';
            html += '<button class="tc-btn-print" title="Editar" onclick="event.stopPropagation();TipoCambio.cargarFila(' + i + ')"><i class="fas fa-pen"></i></button>';
            html += '</td>';
            html += '</tr>';
        }

        html += '</tbody></table>';
        container.innerHTML = html;
        footerInfo.textContent = data.length + ' registro(s)' + (total ? ' de ' + total : '');
    },

    seleccionarFila: function(tr, idx) {
        var rows = document.querySelectorAll('.tc-tabla tr');
        for (var i = 0; i < rows.length; i++) rows[i].classList.remove('tc-selected');
        tr.classList.add('tc-selected');
        this.seleccionado = this.datos[idx];
    },

    cargarFila: function(idx) {
        var d = this.datos[idx];
        if (!d) return;

        document.getElementById('tcFormFecha').value = d.fecha.split('T')[0];
        document.getElementById('tcFormCompra').value = d.compra;
        document.getElementById('tcFormVenta').value = d.venta;
        document.getElementById('tcFormFecha').disabled = true;

        document.getElementById('tcBtnGuardar').style.display = 'none';
        document.getElementById('tcBtnActualizar').style.display = '';
        document.getElementById('tcBtnCancelar').style.display = '';

        this.seleccionado = d;
    },

    imprimirFila: async function(idx) {
        var d = this.datos[idx];
        if (!d) return;
        var fecha = self_formatFecha(d.fecha);
        var di = await TablaGenerica._obtenerDatosImpresion();
        var ph = new Date().toLocaleString('es-PE');

        var html = '<div class="prov-print-header"><div>' + di.logoHtml + '<div style="display:inline-block;vertical-align:middle">' +
            '<div class="prov-print-titulo">Tipo de Cambio</div>' +
            (di.empresa ? '<div style="font-size:0.8rem;color:#1A4480;font-weight:600;margin-top:4px">' + di.empresa + '</div>' : '') +
            (di.sucursal ? '<div style="font-size:0.7rem;color:#64748B;margin-top:1px">' + di.sucursal + '</div>' : '') +
            '</div></div><div class="prov-print-fecha">' + ph + '</div></div>';
        html += '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)"><th style="white-space:nowrap">Fecha</th><th style="text-align:right;white-space:nowrap">Compra (USD/PEN)</th><th style="text-align:right;white-space:nowrap">Venta (USD/PEN)</th><th style="white-space:nowrap">Fuente</th></tr></thead><tbody>';
        html += '<tr><td>' + fecha + '</td><td style="text-align:right">' + parseFloat(d.compra).toFixed(4) + '</td><td style="text-align:right">' + parseFloat(d.venta).toFixed(4) + '</td><td>' + (d.fuente || 'MANUAL') + '</td></tr>';
        html += '</tbody></table></div>';
        TipoCambio._imprimirSrcdoc(html, 'Tipo de Cambio');
    },

    imprimirTodos: async function() {
        if (!this.datos || this.datos.length === 0) {
            Mensaje.error({ titulo: 'Sin datos', texto: 'No hay registros para imprimir' });
            return;
        }
        var di = await TablaGenerica._obtenerDatosImpresion();
        var ph = new Date().toLocaleString('es-PE');

        var html = '<div class="prov-print-header"><div>' + di.logoHtml + '<div style="display:inline-block;vertical-align:middle">' +
            '<div class="prov-print-titulo">Tipo de Cambio</div>' +
            (di.empresa ? '<div style="font-size:0.8rem;color:#1A4480;font-weight:600;margin-top:4px">' + di.empresa + '</div>' : '') +
            (di.sucursal ? '<div style="font-size:0.7rem;color:#64748B;margin-top:1px">' + di.sucursal + '</div>' : '') +
            '</div></div><div class="prov-print-fecha">' + ph + '</div></div>';
        html += '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)"><th style="white-space:nowrap">Fecha</th><th style="text-align:right;white-space:nowrap">Compra (USD/PEN)</th><th style="text-align:right;white-space:nowrap">Venta (USD/PEN)</th><th style="white-space:nowrap">Fuente</th></tr></thead><tbody>';
        for (var i = 0; i < this.datos.length; i++) {
            var d = this.datos[i];
            html += '<tr><td>' + self_formatFecha(d.fecha) + '</td><td style="text-align:right">' + parseFloat(d.compra).toFixed(4) + '</td><td style="text-align:right">' + parseFloat(d.venta).toFixed(4) + '</td><td>' + (d.fuente || 'MANUAL') + '</td></tr>';
        }
        html += '</tbody></table></div>';
        TipoCambio._imprimirSrcdoc(html, 'Tipo de Cambio');
    },

    _imprimirSrcdoc: function(html, titulo) {
        var fullHtml = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>' + (titulo || 'Reporte') + '</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-titulo{font-size:1.2rem;font-weight:800;color:#1A4480;text-transform:uppercase;letter-spacing:0.5px}' +
            '.prov-print-fecha{font-size:0.65rem;color:#64748B}' +
            '.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-footer{text-align:center;font-size:0.65rem;color:#94A3B8;margin-top:20px;border-top:1px solid #E2E8F0;padding-top:8px}' +
            '@page{margin:12mm}' +
            '<' + 'script' + '>window.onload=function(){setTimeout(function(){window.print()},800)};<' + '/' + 'script' + '>' +
            '</style></head><body>' + html + '<div class="prov-print-footer">NexusERP</div></body></html>';

        var oldIframe = document.getElementById('tc-print-frame');
        if (oldIframe) document.body.removeChild(oldIframe);

        var iframe = document.createElement('iframe');
        iframe.id = 'tc-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);
        };
    },

    cancelar: function() {
        document.getElementById('tcFormFecha').value = '';
        document.getElementById('tcFormFecha').disabled = false;
        document.getElementById('tcFormCompra').value = '';
        document.getElementById('tcFormVenta').value = '';
        document.getElementById('tcBtnGuardar').style.display = '';
        document.getElementById('tcBtnActualizar').style.display = 'none';
        document.getElementById('tcBtnCancelar').style.display = 'none';
        this.seleccionado = null;

        var rows = document.querySelectorAll('.tc-tabla tr');
        for (var i = 0; i < rows.length; i++) rows[i].classList.remove('tc-selected');
    },

    guardar: function() {
        var self = this;
        var fecha = document.getElementById('tcFormFecha').value;
        var compra = parseFloat(document.getElementById('tcFormCompra').value);
        var venta = parseFloat(document.getElementById('tcFormVenta').value);

        if (!fecha) { Mensaje.error({ titulo: 'Validación', texto: 'La fecha es requerida' }); return; }
        if (!compra || compra <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'La compra debe ser mayor a 0' }); return; }
        if (!venta || venta <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'La venta debe ser mayor a 0' }); return; }

        fetch(this.API_URL + '/tipo-cambio', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ id_empresa: this.sesion ? this.sesion.id_empresa : undefined, fecha: fecha, compra: compra, venta: venta })
        })
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                Mensaje.exito({ titulo: 'Guardado', texto: res.mensaje });
                self.cancelar();
                self.consultar();
            } else {
                Mensaje.error({ titulo: 'Error', texto: res.mensaje });
            }
        })
        .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al guardar' }); });
    },

    actualizar: function() {
        var self = this;
        var fecha = document.getElementById('tcFormFecha').value;
        var compra = parseFloat(document.getElementById('tcFormCompra').value);
        var venta = parseFloat(document.getElementById('tcFormVenta').value);

        if (!fecha) { Mensaje.error({ titulo: 'Validación', texto: 'La fecha es requerida' }); return; }
        if (!compra || compra <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'La compra debe ser mayor a 0' }); return; }
        if (!venta || venta <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'La venta debe ser mayor a 0' }); return; }

        fetch(this.API_URL + '/tipo-cambio/' + fecha, {
            method: 'PUT',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ id_empresa: this.sesion ? this.sesion.id_empresa : undefined, compra: compra, venta: venta })
        })
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                Mensaje.exito({ titulo: 'Actualizado', texto: res.mensaje });
                self.cancelar();
                self.consultar();
            } else {
                Mensaje.error({ titulo: 'Error', texto: res.mensaje });
            }
        })
        .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al actualizar' }); });
    },

    eliminar: function() {
        var self = this;
        var fecha = document.getElementById('tcFormFecha').value || (this.seleccionado ? this.seleccionado.fecha : '');

        if (!fecha) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione un registro para eliminar' }); return; }

        Mensaje.confirmacion({
            titulo: 'Confirmar eliminación',
            texto: '¿Está seguro de eliminar el tipo de cambio del ' + self_formatFecha(fecha) + '?',
            onAceptar: function() {
                fetch(self.API_URL + '/tipo-cambio/' + fecha + '?id_empresa=' + (self.sesion ? self.sesion.id_empresa : ''), {
                    method: 'DELETE'
                })
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok) {
                        Mensaje.exito({ titulo: 'Eliminado', texto: res.mensaje });
                        self.cancelar();
                        self.consultar();
                    } else {
                        Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    }
                })
                .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al eliminar' }); });
            }
        });
    },

    importarSunat: function() {
        var self = this;
        var mes = parseInt(document.getElementById('tcMes').value);
        var anio = parseInt(document.getElementById('tcAnio').value);
        var btn = document.getElementById('tcBtnImportar');
        var resultado = document.getElementById('tcResultadoImport');

        if (!mes || !anio) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione mes y año' }); return; }

        btn.disabled = true;
        btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Importando...';
        resultado.className = 'tc-resultado';
        resultado.style.display = 'none';

        fetch(this.API_URL + '/tipo-cambio/importar-sunat', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ id_empresa: this.sesion ? this.sesion.id_empresa : undefined, mes: mes, anio: anio })
        })
        .then(function(r) { return r.json(); })
        .then(function(res) {
            btn.disabled = false;
            btn.innerHTML = '<i class="fas fa-download"></i> Importar mes desde SUNAT';

            if (res.ok) {
                resultado.className = 'tc-resultado tc-resultado-ok';
                resultado.innerHTML = '<i class="fas fa-check-circle"></i> ' + res.mensaje + ': ' + res.insertados + ' insertados, ' + res.actualizados + ' actualizados, ' + res.completados_faltantes + ' días faltantes completados';
                resultado.style.display = 'block';
                self.consultar();
            } else {
                resultado.className = 'tc-resultado tc-resultado-error';
                resultado.innerHTML = '<i class="fas fa-exclamation-triangle"></i> ' + (res.mensaje || 'Error al importar');
                resultado.style.display = 'block';
            }
        })
        .catch(function() {
            btn.disabled = false;
            btn.innerHTML = '<i class="fas fa-download"></i> Importar mes desde SUNAT';
            resultado.className = 'tc-resultado tc-resultado-error';
            resultado.innerHTML = '<i class="fas fa-exclamation-triangle"></i> Error de conexión con el servidor';
            resultado.style.display = 'block';
        });
    },

    limpiarFiltros: function() {
        var mesActual = new Date().getMonth() + 1;
        var anioActual = new Date().getFullYear();
        document.getElementById('tcFiltroMes').value = mesActual;
        document.getElementById('tcFiltroAnio').value = anioActual;
        this.consultar();
    },

    cargarSesion: function() {
        var saved = localStorage.getItem('erp_session') || sessionStorage.getItem('erp_session');
        if (saved) this.sesion = JSON.parse(saved);
    },

    enlazarMenu: function() {
        var self = this;
        var links = document.querySelectorAll('.nav-link[data-page="TipoCambio"]');
        links.forEach(function(link) {
            link.addEventListener('click', function(e) {
                e.preventDefault();
                self.cargarSesion();
                self.init();
            });
        });
    }
};

TipoCambio.enlazarMenu();

function self_formatFecha(fecha) {
    if (!fecha) return '';
    var parts = fecha.split('T')[0].split('-');
    return parts[2] + '/' + parts[1] + '/' + parts[0];
}
