var Proveedores = {
    API_URL: 'http://localhost:3000/api',
    sesion: null,
    paginaActual: 1,
    limite: 20,
    filtroEstado: '1',

    init: function() {
        this.cargarSesion();
        this.enlazarMenu();
    },

    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="Proveedores"]');
        links.forEach(function(link) {
            link.addEventListener('click', function(e) {
                e.preventDefault();
                self.mostrarVista();
            });
        });
    },

    mostrarVista: function() {
        var content = document.getElementById('pageProveedores');
        if (!content) return;

        var pagina = this.sesion.id_empresa;

        content.innerHTML =
            '<div class="prov-toolbar">' +
                '<div class="prov-toolbar-left">' +
                    '<button class="btn-prov btn-prov-primario" id="provBtnNuevo"><i class="fas fa-plus"></i> Nuevo Proveedor</button>' +
                    '<div class="prov-buscador"><i class="fas fa-search"></i><input type="text" id="provBuscar" placeholder="Buscar por razón social, RUC o código..."></div>' +
                '</div>' +
                '<div class="prov-toolbar-right">' +
                    '<select class="prov-filtro" id="provFiltroEstado">' +
                        '<option value="1">Activos</option>' +
                        '<option value="0">Inactivos</option>' +
                        '<option value="">Todos</option>' +
                    '</select>' +
                    '<span class="prov-contador" id="provContador"></span>' +
                '</div>' +
            '</div>' +
            '<div class="prov-tabla-wrap" id="provTablaWrap"></div>' +
            '<div class="prov-paginacion" id="provPaginacion"></div>';

        this.paginaActual = 1;
        this.cargarTabla();
        this.enlazarEventos();
    },

    enlazarEventos: function() {
        var self = this;
        var btnNuevo = document.getElementById('provBtnNuevo');
        var buscar = document.getElementById('provBuscar');
        var filtro = document.getElementById('provFiltroEstado');

        if (btnNuevo) {
            btnNuevo.addEventListener('click', function() {
                self.abrirModal();
            });
        }

        if (buscar) {
            var timer = null;
            buscar.addEventListener('input', function() {
                clearTimeout(timer);
                timer = setTimeout(function() {
                    self.paginaActual = 1;
                    self.cargarTabla();
                }, 400);
            });
        }

        if (filtro) {
            filtro.addEventListener('change', function() {
                self.filtroEstado = this.value;
                self.paginaActual = 1;
                self.cargarTabla();
            });
        }
    },

    cargarTabla: async function() {
        var wrap = document.getElementById('provTablaWrap');
        var pag = document.getElementById('provPaginacion');
        var contador = document.getElementById('provContador');
        if (!wrap) return;

        wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-spinner fa-spin"></i><p>Cargando...</p></div>';
        pag.innerHTML = '';

        try {
            var url = this.API_URL + '/proveedores?id_empresa=' + this.sesion.id_empresa +
                '&buscar=' + encodeURIComponent(document.getElementById('provBuscar').value) +
                '&estado=' + this.filtroEstado +
                '&page=' + this.paginaActual +
                '&limit=' + this.limite;

            var response = await fetch(url);
            var res = await response.json();

            if (!res.ok) {
                wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-exclamation-triangle"></i><p>' + res.mensaje + '</p></div>';
                return;
            }

            if (res.data.length === 0) {
                wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-box-open"></i><p>No se encontraron proveedores</p></div>';
                contador.textContent = '';
                return;
            }

            var html = '<table class="prov-tabla"><thead><tr>' +
                '<th>Código</th>' +
                '<th>Razón Social</th>' +
                '<th>Documento</th>' +
                '<th>Teléfono</th>' +
                '<th>Estado</th>' +
                '<th style="text-align:center">Acciones</th>' +
                '</tr></thead><tbody>';

            res.data.forEach(function(prov) {
                var estadoBadge = prov.estado === true
                    ? '<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>';

                var tipoDoc = prov.tipo_documento || '6';
                var docTexto = tipoDoc + ': ' + (prov.num_documento || 'Sin documento');

                html += '<tr>' +
                    '<td class="col-codigo">' + (prov.cod_proveedor || '-') + '</td>' +
                    '<td class="col-razon">' + prov.razon_social + '</td>' +
                    '<td class="col-doc">' + docTexto + '</td>' +
                    '<td>' + (prov.telefono || prov.celular || '-') + '</td>' +
                    '<td>' + estadoBadge + '</td>' +
                    '<td style="text-align:center"><div class="prov-acciones">' +
                        '<button class="prov-btn-accion" title="Editar" data-id="' + prov.id_proveedor + '"><i class="fas fa-pen"></i></button>' +
                        '<button class="prov-btn-accion prov-btn-eliminar" title="Eliminar" data-id="' + prov.id_proveedor + '" data-razon="' + prov.razon_social + '"><i class="fas fa-trash-can"></i></button>' +
                    '</div></td>' +
                    '</tr>';
            });

            html += '</tbody></table>';
            wrap.innerHTML = html;
            contador.textContent = res.total + ' registro(s)';

            this.renderPaginacion(res.total, res.totalPaginas);

            var self = this;
            wrap.querySelectorAll('.prov-btn-accion:not(.prov-btn-eliminar)').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    self.abrirModal(parseInt(this.dataset.id));
                });
            });

            wrap.querySelectorAll('.prov-btn-eliminar').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    self.eliminar(parseInt(this.dataset.id), this.dataset.razon);
                });
            });

        } catch (error) {
            console.error('[PROVEEDORES] Error cargar tabla:', error);
            wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-exclamation-triangle"></i><p>Error de conexion con el servidor</p></div>';
        }
    },

    renderPaginacion: function(total, totalPaginas) {
        var pag = document.getElementById('provPaginacion');
        if (!pag) return;

        if (totalPaginas <= 1) {
            pag.innerHTML = '<span>Total: ' + total + ' registro(s)</span>';
            return;
        }

        var self = this;
        var html = '<div class="prov-pag-btns">';

        html += '<button class="prov-pag-btn" data-page="' + (this.paginaActual - 1) + '" ' + (this.paginaActual <= 1 ? 'disabled' : '') + '><i class="fas fa-chevron-left"></i></button>';

        var inicio = Math.max(1, this.paginaActual - 2);
        var fin = Math.min(totalPaginas, this.paginaActual + 2);

        for (var i = inicio; i <= fin; i++) {
            var activa = i === this.paginaActual ? ' activo' : '';
            html += '<button class="prov-pag-btn' + activa + '" data-page="' + i + '">' + i + '</button>';
        }

        html += '<button class="prov-pag-btn" data-page="' + (this.paginaActual + 1) + '" ' + (this.paginaActual >= totalPaginas ? 'disabled' : '') + '><i class="fas fa-chevron-right"></i></button>';
        html += '</div>';
        html += '<span>Página ' + this.paginaActual + ' de ' + totalPaginas + ' (' + total + ' registros)</span>';

        pag.innerHTML = html;

        pag.querySelectorAll('.prov-pag-btn[data-page]').forEach(function(btn) {
            btn.addEventListener('click', function() {
                if (this.disabled) return;
                self.paginaActual = parseInt(this.dataset.page);
                self.cargarTabla();
                document.getElementById('contentArea').scrollTop = 0;
            });
        });
    },

    abrirModal: async function(idProveedor) {
        var self = this;
        var esNuevo = !idProveedor;
        var titulo = esNuevo ? 'Nuevo Proveedor' : 'Editar Proveedor';
        var proveedor = {
            tipo_documento: '6',
            tipo_proveedor: '1'
        };

        if (!esNuevo) {
            try {
                var response = await fetch(this.API_URL + '/proveedores/' + idProveedor);
                var res = await response.json();
                if (!res.ok) {
                    Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    return;
                }
                proveedor = res.data;
            } catch (error) {
                Mensaje.error({ titulo: 'Error', texto: 'No se pudo obtener el proveedor' });
                return;
            }
        }

        var html = '<form id="provForm" novalidate>' +
            '<div class="prov-form">' +
                '<div class="prov-field"><label>Tipo Documento <span class="requerido">*</span></label>' +
                    '<select id="provTipoDoc" name="tipo_documento"></select></div>' +
                '<div class="prov-field"><label>N° Documento</label>' +
                    '<input type="text" id="provNumDoc" name="num_documento" maxlength="20" placeholder="Ingrese número"></div>' +
                '<div class="prov-field-full"><label>Razón Social <span class="requerido">*</span></label>' +
                    '<input type="text" id="provRazonSocial" name="razon_social" maxlength="90" placeholder="Ingrese razón social" value="' + (proveedor.razon_social || '') + '" required></div>' +
                '<div class="prov-field-full"><label>Dirección</label>' +
                    '<input type="text" id="provDireccion" name="direccion" maxlength="90" placeholder="Dirección completa" value="' + (proveedor.direccion || '') + '"></div>' +
                '<div class="prov-ubigeo-row">' +
                    '<div class="prov-field"><label>Departamento</label><select id="provDepartamento" name="departamento"><option value="">Cargando...</option></select></div>' +
                    '<div class="prov-field"><label>Provincia</label><select id="provProvincia" name="provincia" disabled><option value="">Seleccione...</option></select></div>' +
                    '<div class="prov-field"><label>Distrito</label><select id="provDistrito" name="distrito" disabled><option value="">Seleccione...</option></select></div>' +
                '</div>' +
                '<div class="prov-field"><label>Teléfono</label>' +
                    '<input type="text" id="provTelefono" name="telefono" maxlength="20" placeholder="Fijo" value="' + (proveedor.telefono || '') + '"></div>' +
                '<div class="prov-field"><label>Celular</label>' +
                    '<input type="text" id="provCelular" name="celular" maxlength="20" placeholder="Móvil" value="' + (proveedor.celular || '') + '"></div>' +
                '<div class="prov-field"><label>Email</label>' +
                    '<input type="email" id="provEmail" name="email" maxlength="40" placeholder="correo@ejemplo.com" value="' + (proveedor.email || '') + '"></div>' +
                '<div class="prov-field"><label>Persona de Contacto</label>' +
                    '<input type="text" id="provContacto" name="contacto_nombre" maxlength="60" placeholder="Nombre" value="' + (proveedor.contacto_nombre || '') + '"></div>' +
                '<div class="prov-field"><label>Tel. Contacto</label>' +
                    '<input type="text" id="provTelContacto" name="contacto_telefono" maxlength="20" placeholder="Teléfono" value="' + (proveedor.contacto_telefono || '') + '"></div>' +
                '<div class="prov-field"><label>Tipo Proveedor</label>' +
                    '<select id="provTipoProv" name="tipo_proveedor">' +
                        '<option value="1"' + (proveedor.tipo_proveedor === '1' ? ' selected' : '') + '>Nacional</option>' +
                        '<option value="2"' + (proveedor.tipo_proveedor === '2' ? ' selected' : '') + '>Extranjero</option>' +
                    '</select></div>' +
            '</div>' +
            '<div class="prov-form-botones">' +
                '<button type="button" class="btn-prov-cancelar" id="provBtnCancelar">Cancelar</button>' +
                '<button type="submit" class="btn-prov-guardar" id="provBtnGuardar">Guardar</button>' +
            '</div>' +
            '<input type="hidden" id="provId" value="' + (proveedor.id_proveedor || '') + '">' +
            '<input type="hidden" id="provCodUbigeo" value="' + (proveedor.cod_ubigeo || '') + '">' +
            '<input type="hidden" id="provCreadoPor" value="' + this.sesion.id_usuario + '">' +
            '<input type="hidden" id="provIdEmpresa" value="' + this.sesion.id_empresa + '">' +
            '</form>';

        Modal.abrir({
            titulo: titulo,
            ancho: '680px',
            contenido: html,
            onAbierto: function() {
                self.cargarTiposDocumento();
                if (!esNuevo) {
                    self.cargarUbigeoPorCodigo(proveedor.cod_ubigeo);
                }
                self.enlazarEventosForm(esNuevo);
            }
        });
    },

    enlazarEventosFormulario: function(esNuevo) {
        var self = this;
        var form = document.getElementById('provForm');
        var tipoDoc = document.getElementById('provTipoDoc');
        var departamento = document.getElementById('provDepartamento');
        var provincia = document.getElementById('provProvincia');
        var distrito = document.getElementById('provDistrito');
        var btnCancelar = document.getElementById('provBtnCancelar');
        var numDoc = document.getElementById('provNumDoc');

        if (tipoDoc) {
            tipoDoc.addEventListener('change', function() {
                var longitud = parseInt(this.options[this.selectedIndex].dataset.longitud) || 0;
                numDoc.maxLength = longitud > 0 ? longitud : 20;
                numDoc.placeholder = longitud > 0 ? 'Ingrese ' + longitud + ' dígitos' : 'Ingrese número';
                numDoc.value = '';
                numDoc.classList.remove('error');
                self.ocultarError('provNumDoc');
            });
            tipoDoc.value = document.getElementById('provTipoDoc') ? tipoDoc.value : '6';
            tipoDoc.dispatchEvent(new Event('change'));
        }

        if (departamento) {
            departamento.addEventListener('change', function() {
                self.cargarProvincias(this.value);
                provincia.innerHTML = '<option value="">Seleccione...</option>';
                distrito.innerHTML = '<option value="">Seleccione...</option>';
                provincia.disabled = true;
                distrito.disabled = true;
            });
        }

        if (provincia) {
            provincia.addEventListener('change', function() {
                self.cargarDistritos(departamento.value, this.value);
                distrito.innerHTML = '<option value="">Seleccione...</option>';
                distrito.disabled = true;
            });
        }

        if (distrito) {
            distrito.addEventListener('change', function() {
                document.getElementById('provCodUbigeo').value = departamento.value + provincia.value + this.value;
            });
        }

        if (btnCancelar) {
            btnCancelar.addEventListener('click', function() {
                Modal.cerrar();
            });
        }

        if (form) {
            form.addEventListener('submit', function(e) {
                e.preventDefault();
                self.guardar(esNuevo);
            });
        }
    },

    cargarTiposDocumento: async function() {
        var select = document.getElementById('provTipoDoc');
        if (!select) return;
        try {
            var res = await fetch(this.API_URL + '/tipos-documento');
            var data = await res.json();
            if (!data.ok) return;
            var html = '';
            data.data.forEach(function(tipo) {
                var sel = tipo.codigo === '6' ? ' selected' : '';
                html += '<option value="' + tipo.codigo + '"' + sel + ' data-longitud="' + tipo.longitud + '">' + tipo.descripcion + '</option>';
            });
            select.innerHTML = html;
        } catch (error) {
            console.error('[PROVEEDORES] Error cargar tipos documento:', error);
        }
    },

    cargarProvincias: async function(codDep) {
        var select = document.getElementById('provProvincia');
        if (!codDep) {
            select.innerHTML = '<option value="">Seleccione...</option>';
            select.disabled = true;
            return;
        }
        select.innerHTML = '<option value="">Cargando...</option>';
        try {
            var res = await fetch(this.API_URL + '/ubigeo/provincias/' + codDep);
            var data = await res.json();
            var html = '<option value="">Seleccione provincia...</option>';
            if (data.ok) {
                data.data.forEach(function(p) {
                    html += '<option value="' + p.codigo + '">' + p.nombre + '</option>';
                });
            }
            select.innerHTML = html;
            select.disabled = false;
        } catch (error) {
            select.innerHTML = '<option value="">Error...</option>';
        }
    },

    cargarDistritos: async function(codDep, codProv) {
        var select = document.getElementById('provDistrito');
        if (!codDep || !codProv) {
            select.innerHTML = '<option value="">Seleccione...</option>';
            select.disabled = true;
            return;
        }
        select.innerHTML = '<option value="">Cargando...</option>';
        try {
            var res = await fetch(this.API_URL + '/ubigeo/distritos/' + codDep + '/' + codProv);
            var data = await res.json();
            var html = '<option value="">Seleccione distrito...</option>';
            if (data.ok) {
                data.data.forEach(function(d) {
                    html += '<option value="' + d.codigo + '"' + (d.codigo === document.getElementById('provCodUbigeo').value.substring(4, 6) ? ' selected' : '') + '>' + d.nombre + '</option>';
                });
            }
            select.innerHTML = html;
            select.disabled = false;
        } catch (error) {
            select.innerHTML = '<option value="">Error...</option>';
        }
    },

    cargarUbigeoPorCodigo: async function(codUbigeo) {
        if (!codUbigeo) return;
        var codDep = codUbigeo.substring(0, 2);
        var codProv = codUbigeo.substring(2, 4);
        await this.cargarProvincias(codDep);
        await this.cargarDistritos(codDep, codProv);
    },

    mostrarError: function(id, texto) {
        var campo = document.getElementById(id);
        var error = document.getElementById(id + 'Error');
        if (campo) campo.classList.add('error');
        if (error) {
            error.textContent = texto;
            error.classList.add('visible');
        }
    },

    ocultarError: function(id) {
        var campo = document.getElementById(id);
        var error = document.getElementById(id + 'Error');
        if (campo) campo.classList.remove('error');
        if (error) error.classList.remove('visible');
    },

    validar: function() {
        var valido = true;
        var razonSocial = document.getElementById('provRazonSocial');
        var numDoc = document.getElementById('provNumDoc');

        if (!razonSocial.value.trim()) {
            this.mostrarError('provRazonSocial', 'La razón social es obligatoria');
            valido = false;
        } else {
            this.ocultarError('provRazonSocial');
        }

        if (numDoc.value.trim() && numDoc.classList.contains('error')) {
            valido = false;
        }

        return valido;
    },

    guardar: async function(esNuevo) {
        if (!this.validar()) return;

        var self = this;
        var btn = document.getElementById('provBtnGuardar');
        btn.classList.add('loading');
        btn.textContent = 'Guardando...';

        var datos = {
            id_empresa: parseInt(document.getElementById('provIdEmpresa').value),
            tipo_documento: document.getElementById('provTipoDoc').value,
            num_documento: document.getElementById('provNumDoc').value.trim() || null,
            razon_social: document.getElementById('provRazonSocial').value.trim(),
            direccion: document.getElementById('provDireccion').value.trim() || null,
            cod_ubigeo: document.getElementById('provCodUbigeo').value || null,
            telefono: document.getElementById('provTelefono').value.trim() || null,
            celular: document.getElementById('provCelular').value.trim() || null,
            email: document.getElementById('provEmail').value.trim() || null,
            contacto_nombre: document.getElementById('provContacto').value.trim() || null,
            contacto_telefono: document.getElementById('provTelContacto').value.trim() || null,
            tipo_proveedor: document.getElementById('provTipoProv').value,
            creado_por: parseInt(document.getElementById('provCreadoPor').value)
        };

        if (!esNuevo) {
            datos.id_proveedor = parseInt(document.getElementById('provId').value);
            datos.modificado_por = datos.creado_por;
        }

        try {
            var url = this.API_URL + '/proveedores';
            var metodo = esNuevo ? 'POST' : 'PUT';
            var response = await fetch(url, {
                method: metodo,
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(datos)
            });
            var res = await response.json();

            btn.classList.remove('loading');
            btn.textContent = 'Guardar';

            if (res.ok) {
                Modal.cerrar();
                Mensaje.exito({
                    titulo: esNuevo ? 'Proveedor registrado' : 'Proveedor actualizado',
                    texto: esNuevo ? 'Se registró correctamente con código ' + res.data.cod_proveedor : 'Se actualizó correctamente',
                    autocerrar: true,
                    autocerrarSegundos: 2500
                });
                this.cargarTabla();
            } else {
                Mensaje.error({
                    titulo: 'Error',
                    texto: res.mensaje
                });
            }
        } catch (error) {
            btn.classList.remove('loading');
            btn.textContent = 'Guardar';
            Mensaje.error({ titulo: 'Error', texto: 'No se pudo conectar con el servidor' });
        }
    },

    eliminar: function(id, razon) {
        var self = this;
        Mensaje.confirmacion({
            titulo: 'Eliminar proveedor',
            texto: 'Está seguro de eliminar "' + razon + '"? El proveedor quedará inactivo pero se conservará el historial.',
            btnAceptarTexto: 'Eliminar',
            btnCancelarTexto: 'Cancelar',
            onAceptar: async function() {
                try {
                    var response = await fetch(self.API_URL + '/proveedores/' + id, { method: 'DELETE' });
                    var res = await response.json();

                    if (res.ok) {
                        Mensaje.exito({
                            titulo: 'Proveedor eliminado',
                            texto: 'Se cambió a estado inactivo correctamente',
                            autocerrar: true,
                            autocerrarSegundos: 2500
                        });
                        self.cargarTabla();
                    } else {
                        Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    }
                } catch (error) {
                    Mensaje.error({ titulo: 'Error', texto: 'No se pudo conectar con el servidor' });
                }
            }
        });
    }
};

document.addEventListener('DOMContentLoaded', function() {
    Proveedores.init();
});


/*

var Proveedores = {
    API_URL: 'http://localhost:3000/api',
    sesion: null,
    paginaActual: 1,
    limite: 20,
    filtroEstado: '1',

    init: function() {
        this.cargarSesion();
        this.enlazarMenu();
    },

    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="Proveedores"]');
        links.forEach(function(link) {
            link.addEventListener('click', function(e) {
                e.preventDefault();
                self.mostrarVista();
            });
        });
    },

    mostrarVista: function() {
        var content = document.getElementById('pageProveedores');
        if (!content) return;

        var pagina = this.sesion.id_empresa;

        content.innerHTML =
            '<div class="prov-toolbar">' +
                '<div class="prov-toolbar-left">' +
                    '<button class="btn-prov btn-prov-primario" id="provBtnNuevo"><i class="fas fa-plus"></i> Nuevo Proveedor</button>' +
                    '<div class="prov-buscador"><i class="fas fa-search"></i><input type="text" id="provBuscar" placeholder="Buscar por razón social, RUC o código..."></div>' +
                '</div>' +
                '<div class="prov-toolbar-right">' +
                    '<select class="prov-filtro" id="provFiltroEstado">' +
                        '<option value="1">Activos</option>' +
                        '<option value="0">Inactivos</option>' +
                        '<option value="">Todos</option>' +
                    '</select>' +
                    '<span class="prov-contador" id="provContador"></span>' +
                '</div>' +
            '</div>' +
            '<div class="prov-tabla-wrap" id="provTablaWrap"></div>' +
            '<div class="prov-paginacion" id="provPaginacion"></div>';

        this.paginaActual = 1;
        this.cargarTabla();
        this.enlazarEventos();
    },

    enlazarEventos: function() {
        var self = this;
        var btnNuevo = document.getElementById('provBtnNuevo');
        var buscar = document.getElementById('provBuscar');
        var filtro = document.getElementById('provFiltroEstado');

        if (btnNuevo) {
            btnNuevo.addEventListener('click', function() {
                self.abrirModal();
            });
        }

        if (buscar) {
            var timer = null;
            buscar.addEventListener('input', function() {
                clearTimeout(timer);
                timer = setTimeout(function() {
                    self.paginaActual = 1;
                    self.cargarTabla();
                }, 400);
            });
        }

        if (filtro) {
            filtro.addEventListener('change', function() {
                self.filtroEstado = this.value;
                self.paginaActual = 1;
                self.cargarTabla();
            });
        }
    },

    cargarTabla: async function() {
        var wrap = document.getElementById('provTablaWrap');
        var pag = document.getElementById('provPaginacion');
        var contador = document.getElementById('provContador');
        if (!wrap) return;

        wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-spinner fa-spin"></i><p>Cargando...</p></div>';
        pag.innerHTML = '';

        try {
            var url = this.API_URL + '/proveedores?id_empresa=' + this.sesion.id_empresa +
                '&buscar=' + encodeURIComponent(document.getElementById('provBuscar').value) +
                '&estado=' + this.filtroEstado +
                '&page=' + this.paginaActual +
                '&limit=' + this.limite;

            var response = await fetch(url);
            var res = await response.json();

            if (!res.ok) {
                wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-exclamation-triangle"></i><p>' + res.mensaje + '</p></div>';
                return;
            }

            if (res.data.length === 0) {
                wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-box-open"></i><p>No se encontraron proveedores</p></div>';
                contador.textContent = '';
                return;
            }

            var html = '<table class="prov-tabla"><thead><tr>' +
                '<th>Código</th>' +
                '<th>Razón Social</th>' +
                '<th>Documento</th>' +
                '<th>Teléfono</th>' +
                '<th>Estado</th>' +
                '<th style="text-align:center">Acciones</th>' +
                '</tr></thead><tbody>';

            res.data.forEach(function(prov) {
                var estadoBadge = prov.estado === true
                    ? '<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>';

                var tipoDoc = prov.tipo_documento || '6';
                var docTexto = tipoDoc + ': ' + (prov.num_documento || 'Sin documento');

                html += '<tr>' +
                    '<td class="col-codigo">' + (prov.cod_proveedor || '-') + '</td>' +
                    '<td class="col-razon">' + prov.razon_social + '</td>' +
                    '<td class="col-doc">' + docTexto + '</td>' +
                    '<td>' + (prov.telefono || prov.celular || '-') + '</td>' +
                    '<td>' + estadoBadge + '</td>' +
                    '<td style="text-align:center"><div class="prov-acciones">' +
                        '<button class="prov-btn-accion" title="Editar" data-id="' + prov.id_proveedor + '"><i class="fas fa-pen"></i></button>' +
                        '<button class="prov-btn-accion prov-btn-eliminar" title="Eliminar" data-id="' + prov.id_proveedor + '" data-razon="' + prov.razon_social + '"><i class="fas fa-trash-can"></i></button>' +
                    '</div></td>' +
                    '</tr>';
            });

            html += '</tbody></table>';
            wrap.innerHTML = html;
            contador.textContent = res.total + ' registro(s)';

            this.renderPaginacion(res.total, res.totalPaginas);

            var self = this;
            wrap.querySelectorAll('.prov-btn-accion:not(.prov-btn-eliminar)').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    self.abrirModal(parseInt(this.dataset.id));
                });
            });

            wrap.querySelectorAll('.prov-btn-eliminar').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    self.eliminar(parseInt(this.dataset.id), this.dataset.razon);
                });
            });

        } catch (error) {
            console.error('[PROVEEDORES] Error cargar tabla:', error);
            wrap.innerHTML = '<div class="prov-vacio"><i class="fas fa-exclamation-triangle"></i><p>Error de conexion con el servidor</p></div>';
        }
    },

    renderPaginacion: function(total, totalPaginas) {
        var pag = document.getElementById('provPaginacion');
        if (!pag) return;

        if (totalPaginas <= 1) {
            pag.innerHTML = '<span>Total: ' + total + ' registro(s)</span>';
            return;
        }

        var self = this;
        var html = '<div class="prov-pag-btns">';

        html += '<button class="prov-pag-btn" data-page="' + (this.paginaActual - 1) + '" ' + (this.paginaActual <= 1 ? 'disabled' : '') + '><i class="fas fa-chevron-left"></i></button>';

        var inicio = Math.max(1, this.paginaActual - 2);
        var fin = Math.min(totalPaginas, this.paginaActual + 2);

        for (var i = inicio; i <= fin; i++) {
            var activa = i === this.paginaActual ? ' activo' : '';
            html += '<button class="prov-pag-btn' + activa + '" data-page="' + i + '">' + i + '</button>';
        }

        html += '<button class="prov-pag-btn" data-page="' + (this.paginaActual + 1) + '" ' + (this.paginaActual >= totalPaginas ? 'disabled' : '') + '><i class="fas fa-chevron-right"></i></button>';
        html += '</div>';
        html += '<span>Página ' + this.paginaActual + ' de ' + totalPaginas + ' (' + total + ' registros)</span>';

        pag.innerHTML = html;

        pag.querySelectorAll('.prov-pag-btn[data-page]').forEach(function(btn) {
            btn.addEventListener('click', function() {
                if (this.disabled) return;
                self.paginaActual = parseInt(this.dataset.page);
                self.cargarTabla();
                document.getElementById('contentArea').scrollTop = 0;
            });
        });
    },

    abrirModal: async function(idProveedor) {
        var self = this;
        var esNuevo = !idProveedor;
        var titulo = esNuevo ? 'Nuevo Proveedor' : 'Editar Proveedor';
        var proveedor = {
            tipo_documento: '6',
            tipo_proveedor: '1'
        };

        if (!esNuevo) {
            try {
                var response = await fetch(this.API_URL + '/proveedores/' + idProveedor);
                var res = await response.json();
                if (!res.ok) {
                    Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    return;
                }
                proveedor = res.data;
            } catch (error) {
                Mensaje.error({ titulo: 'Error', texto: 'No se pudo obtener el proveedor' });
                return;
            }
        }

        var html = '<form id="provForm" novalidate>' +
            '<div class="prov-form">' +
                '<div class="prov-field"><label>Tipo Documento <span class="requerido">*</span></label>' +
                    '<select id="provTipoDoc" name="tipo_documento"></select></div>' +
                '<div class="prov-field"><label>N° Documento</label>' +
                    '<input type="text" id="provNumDoc" name="num_documento" maxlength="20" placeholder="Ingrese número"></div>' +
                '<div class="prov-field-full"><label>Razón Social <span class="requerido">*</span></label>' +
                    '<input type="text" id="provRazonSocial" name="razon_social" maxlength="90" placeholder="Ingrese razón social" value="' + (proveedor.razon_social || '') + '" required></div>' +
                '<div class="prov-field-full"><label>Dirección</label>' +
                    '<input type="text" id="provDireccion" name="direccion" maxlength="90" placeholder="Dirección completa" value="' + (proveedor.direccion || '') + '"></div>' +
                '<div class="prov-ubigeo-row">' +
                    '<div class="prov-field"><label>Departamento</label><select id="provDepartamento" name="departamento"><option value="">Cargando...</option></select></div>' +
                    '<div class="prov-field"><label>Provincia</label><select id="provProvincia" name="provincia" disabled><option value="">Seleccione...</option></select></div>' +
                    '<div class="prov-field"><label>Distrito</label><select id="provDistrito" name="distrito" disabled><option value="">Seleccione...</option></select></div>' +
                '</div>' +
                '<div class="prov-field"><label>Teléfono</label>' +
                    '<input type="text" id="provTelefono" name="telefono" maxlength="20" placeholder="Fijo" value="' + (proveedor.telefono || '') + '"></div>' +
                '<div class="prov-field"><label>Celular</label>' +
                    '<input type="text" id="provCelular" name="celular" maxlength="20" placeholder="Móvil" value="' + (proveedor.celular || '') + '"></div>' +
                '<div class="prov-field"><label>Email</label>' +
                    '<input type="email" id="provEmail" name="email" maxlength="40" placeholder="correo@ejemplo.com" value="' + (proveedor.email || '') + '"></div>' +
                '<div class="prov-field"><label>Persona de Contacto</label>' +
                    '<input type="text" id="provContacto" name="contacto_nombre" maxlength="60" placeholder="Nombre" value="' + (proveedor.contacto_nombre || '') + '"></div>' +
                '<div class="prov-field"><label>Tel. Contacto</label>' +
                    '<input type="text" id="provTelContacto" name="contacto_telefono" maxlength="20" placeholder="Teléfono" value="' + (proveedor.contacto_telefono || '') + '"></div>' +
                '<div class="prov-field"><label>Tipo Proveedor</label>' +
                    '<select id="provTipoProv" name="tipo_proveedor">' +
                        '<option value="1"' + (proveedor.tipo_proveedor === '1' ? ' selected' : '') + '>Nacional</option>' +
                        '<option value="2"' + (proveedor.tipo_proveedor === '2' ? ' selected' : '') + '>Extranjero</option>' +
                    '</select></div>' +
            '</div>' +
            '<div class="prov-form-botones">' +
                '<button type="button" class="btn-prov-cancelar" id="provBtnCancelar">Cancelar</button>' +
                '<button type="submit" class="btn-prov-guardar" id="provBtnGuardar">Guardar</button>' +
            '</div>' +
            '<input type="hidden" id="provId" value="' + (proveedor.id_proveedor || '') + '">' +
            '<input type="hidden" id="provCodUbigeo" value="' + (proveedor.cod_ubigeo || '') + '">' +
            '<input type="hidden" id="provCreadoPor" value="' + this.sesion.id_usuario + '">' +
            '<input type="hidden" id="provIdEmpresa" value="' + this.sesion.id_empresa + '">' +
            '</form>';

        Modal.abrir({
            titulo: titulo,
            ancho: '680px',
            contenido: html,
            onAbierto: function() {
                self.cargarTiposDocumento();
                if (!esNuevo) {
                    self.cargarUbigeoPorCodigo(proveedor.cod_ubigeo);
                }
                self.enlazarEventosForm(esNuevo);
            }
        });
    },

    enlazarEventosFormulario: function(esNuevo) {
        var self = this;
        var form = document.getElementById('provForm');
        var tipoDoc = document.getElementById('provTipoDoc');
        var departamento = document.getElementById('provDepartamento');
        var provincia = document.getElementById('provProvincia');
        var distrito = document.getElementById('provDistrito');
        var btnCancelar = document.getElementById('provBtnCancelar');
        var numDoc = document.getElementById('provNumDoc');

        if (tipoDoc) {
            tipoDoc.addEventListener('change', function() {
                var longitud = parseInt(this.options[this.selectedIndex].dataset.longitud) || 0;
                numDoc.maxLength = longitud > 0 ? longitud : 20;
                numDoc.placeholder = longitud > 0 ? 'Ingrese ' + longitud + ' dígitos' : 'Ingrese número';
                numDoc.value = '';
                numDoc.classList.remove('error');
                self.ocultarError('provNumDoc');
            });
            tipoDoc.value = document.getElementById('provTipoDoc') ? tipoDoc.value : '6';
            tipoDoc.dispatchEvent(new Event('change'));
        }

        if (departamento) {
            departamento.addEventListener('change', function() {
                self.cargarProvincias(this.value);
                provincia.innerHTML = '<option value="">Seleccione...</option>';
                distrito.innerHTML = '<option value="">Seleccione...</option>';
                provincia.disabled = true;
                distrito.disabled = true;
            });
        }

        if (provincia) {
            provincia.addEventListener('change', function() {
                self.cargarDistritos(departamento.value, this.value);
                distrito.innerHTML = '<option value="">Seleccione...</option>';
                distrito.disabled = true;
            });
        }

        if (distrito) {
            distrito.addEventListener('change', function() {
                document.getElementById('provCodUbigeo').value = departamento.value + provincia.value + this.value;
            });
        }

        if (btnCancelar) {
            btnCancelar.addEventListener('click', function() {
                Modal.cerrar();
            });
        }

        if (form) {
            form.addEventListener('submit', function(e) {
                e.preventDefault();
                self.guardar(esNuevo);
            });
        }
    },

    cargarTiposDocumento: async function() {
        var select = document.getElementById('provTipoDoc');
        if (!select) return;
        try {
            var res = await fetch(this.API_URL + '/tipos-documento');
            var data = await res.json();
            if (!data.ok) return;
            var html = '';
            data.data.forEach(function(tipo) {
                var sel = tipo.codigo === '6' ? ' selected' : '';
                html += '<option value="' + tipo.codigo + '"' + sel + ' data-longitud="' + tipo.longitud + '">' + tipo.descripcion + '</option>';
            });
            select.innerHTML = html;
        } catch (error) {
            console.error('[PROVEEDORES] Error cargar tipos documento:', error);
        }
    },

    cargarProvincias: async function(codDep) {
        var select = document.getElementById('provProvincia');
        if (!codDep) {
            select.innerHTML = '<option value="">Seleccione...</option>';
            select.disabled = true;
            return;
        }
        select.innerHTML = '<option value="">Cargando...</option>';
        try {
            var res = await fetch(this.API_URL + '/ubigeo/provincias/' + codDep);
            var data = await res.json();
            var html = '<option value="">Seleccione provincia...</option>';
            if (data.ok) {
                data.data.forEach(function(p) {
                    html += '<option value="' + p.codigo + '">' + p.nombre + '</option>';
                });
            }
            select.innerHTML = html;
            select.disabled = false;
        } catch (error) {
            select.innerHTML = '<option value="">Error...</option>';
        }
    },

    cargarDistritos: async function(codDep, codProv) {
        var select = document.getElementById('provDistrito');
        if (!codDep || !codProv) {
            select.innerHTML = '<option value="">Seleccione...</option>';
            select.disabled = true;
            return;
        }
        select.innerHTML = '<option value="">Cargando...</option>';
        try {
            var res = await fetch(this.API_URL + '/ubigeo/distritos/' + codDep + '/' + codProv);
            var data = await res.json();
            var html = '<option value="">Seleccione distrito...</option>';
            if (data.ok) {
                data.data.forEach(function(d) {
                    html += '<option value="' + d.codigo + '"' + (d.codigo === document.getElementById('provCodUbigeo').value.substring(4, 6) ? ' selected' : '') + '>' + d.nombre + '</option>';
                });
            }
            select.innerHTML = html;
            select.disabled = false;
        } catch (error) {
            select.innerHTML = '<option value="">Error...</option>';
        }
    },

    cargarUbigeoPorCodigo: async function(codUbigeo) {
        if (!codUbigeo) return;
        var codDep = codUbigeo.substring(0, 2);
        var codProv = codUbigeo.substring(2, 4);
        await this.cargarProvincias(codDep);
        await this.cargarDistritos(codDep, codProv);
    },

    mostrarError: function(id, texto) {
        var campo = document.getElementById(id);
        var error = document.getElementById(id + 'Error');
        if (campo) campo.classList.add('error');
        if (error) {
            error.textContent = texto;
            error.classList.add('visible');
        }
    },

    ocultarError: function(id) {
        var campo = document.getElementById(id);
        var error = document.getElementById(id + 'Error');
        if (campo) campo.classList.remove('error');
        if (error) error.classList.remove('visible');
    },

    validar: function() {
        var valido = true;
        var razonSocial = document.getElementById('provRazonSocial');
        var numDoc = document.getElementById('provNumDoc');

        if (!razonSocial.value.trim()) {
            this.mostrarError('provRazonSocial', 'La razón social es obligatoria');
            valido = false;
        } else {
            this.ocultarError('provRazonSocial');
        }

        if (numDoc.value.trim() && numDoc.classList.contains('error')) {
            valido = false;
        }

        return valido;
    },

    guardar: async function(esNuevo) {
        if (!this.validar()) return;

        var self = this;
        var btn = document.getElementById('provBtnGuardar');
        btn.classList.add('loading');
        btn.textContent = 'Guardando...';

        var datos = {
            id_empresa: parseInt(document.getElementById('provIdEmpresa').value),
            tipo_documento: document.getElementById('provTipoDoc').value,
            num_documento: document.getElementById('provNumDoc').value.trim() || null,
            razon_social: document.getElementById('provRazonSocial').value.trim(),
            direccion: document.getElementById('provDireccion').value.trim() || null,
            cod_ubigeo: document.getElementById('provCodUbigeo').value || null,
            telefono: document.getElementById('provTelefono').value.trim() || null,
            celular: document.getElementById('provCelular').value.trim() || null,
            email: document.getElementById('provEmail').value.trim() || null,
            contacto_nombre: document.getElementById('provContacto').value.trim() || null,
            contacto_telefono: document.getElementById('provTelContacto').value.trim() || null,
            tipo_proveedor: document.getElementById('provTipoProv').value,
            creado_por: parseInt(document.getElementById('provCreadoPor').value)
        };

        if (!esNuevo) {
            datos.id_proveedor = parseInt(document.getElementById('provId').value);
            datos.modificado_por = datos.creado_por;
        }

        try {
            var url = this.API_URL + '/proveedores';
            var metodo = esNuevo ? 'POST' : 'PUT';
            var response = await fetch(url, {
                method: metodo,
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(datos)
            });
            var res = await response.json();

            btn.classList.remove('loading');
            btn.textContent = 'Guardar';

            if (res.ok) {
                Modal.cerrar();
                Mensaje.exito({
                    titulo: esNuevo ? 'Proveedor registrado' : 'Proveedor actualizado',
                    texto: esNuevo ? 'Se registró correctamente con código ' + res.data.cod_proveedor : 'Se actualizó correctamente',
                    autocerrar: true,
                    autocerrarSegundos: 2500
                });
                this.cargarTabla();
            } else {
                Mensaje.error({
                    titulo: 'Error',
                    texto: res.mensaje
                });
            }
        } catch (error) {
            btn.classList.remove('loading');
            btn.textContent = 'Guardar';
            Mensaje.error({ titulo: 'Error', texto: 'No se pudo conectar con el servidor' });
        }
    },

    eliminar: function(id, razon) {
        var self = this;
        Mensaje.confirmacion({
            titulo: 'Eliminar proveedor',
            texto: 'Está seguro de eliminar "' + razon + '"? El proveedor quedará inactivo pero se conservará el historial.',
            btnAceptarTexto: 'Eliminar',
            btnCancelarTexto: 'Cancelar',
            onAceptar: async function() {
                try {
                    var response = await fetch(self.API_URL + '/proveedores/' + id, { method: 'DELETE' });
                    var res = await response.json();

                    if (res.ok) {
                        Mensaje.exito({
                            titulo: 'Proveedor eliminado',
                            texto: 'Se cambió a estado inactivo correctamente',
                            autocerrar: true,
                            autocerrarSegundos: 2500
                        });
                        self.cargarTabla();
                    } else {
                        Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    }
                } catch (error) {
                    Mensaje.error({ titulo: 'Error', texto: 'No se pudo conectar con el servidor' });
                }
            }
        });
    }
};

document.addEventListener('DOMContentLoaded', function() {
    Proveedores.init();
});

*/