var Proveedores = {
    API_URL: 'http://localhost:3000/api',
    sesion: null,
    paginaActual: 1,
    limite: 50,
    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;


        document.getElementById('contentArea').classList.add('modulo-activo');
        content.style.display = 'block';

        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();
    },
*/

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

        document.getElementById('contentArea').classList.add('modulo-activo');
        content.style.display = 'flex';

        content.innerHTML =
            '<div class="prov-header">' +
                '<div class="prov-header-left">' +
                    '<div class="prov-header-icon"><i class="fas fa-truck-field"></i></div>' +
                    '<div class="prov-header-titulo">' +
                        '<h2>Proveedores</h2>' +
                        '<p>Gestión de proveedores de la empresa</p>' +
                    '</div>' +
                '</div>' +
                '<span class="prov-contador" id="provContador"></span>' +
            '</div>' +
            '<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 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>' +
                '</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>';
*/

            var html = '<table class="prov-tabla"><thead><tr>' +
                '<th>Código</th>' +
                '<th>Razón Social</th>' +
                '<th>Documento</th>' +
                '<th>Contacto</th>' +
                '<th>Teléfono</th>' +
                '<th>Categoría</th>' +
                '<th>Estado</th>' +
                '<th style="text-align:center;width:100px">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');
                var contacto = prov.contacto_nombre || '-';
                var telefono = prov.telefono || prov.celular || '-';
                var categoria = prov.categoria_nombre || '-';

                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 class="col-contacto">' + contacto + '</td>' +
                    '<td>' + telefono + '</td>' +
                    '<td class="col-categoria">' + categoria + '</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();
                var contentArea = document.querySelector('.content-area');
                if (contentArea) 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">' +

                /* ---- FILA 1: Tipo Doc | N° Doc + SUNAT | Tipo Prov ---- */
                '<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\u00b0 Documento</label>' +
                    '<div class="prov-input-group">' +
                        '<input type="text" id="provNumDoc" name="num_documento" maxlength="20" placeholder="Ingrese n\u00famero" value="' + (proveedor.num_documento || '') + '">' +
                        '<button type="button" class="btn-prov-sunat" id="provBtnSunat" title="Consultar SUNAT"><i class="fas fa-cloud-sun"></i></button>' +
                    '</div>' +
                    '<span class="prov-error-text" id="provNumDocError"></span></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>' +

                /* ---- FILA 2-4: Razón Social, Dirección, Ubigeo ---- */
                '<div class="prov-field-full"><label>Razón Social <span class="requerido">*</span></label>' +
                    '<input type="text" id="provRazonSocial" name="razon_social" maxlength="200" placeholder="Ingrese razón social" value="' + (proveedor.razon_social || '') + '" required>' +
                    '<span class="prov-error-text" id="provRazonSocialError"></span></div>' +
                '<div class="prov-field-full"><label>Dirección</label>' +
                    '<input type="text" id="provDireccion" name="direccion" maxlength="200" placeholder="Dirección completa" value="' + (proveedor.direccion || '') + '"></div>' +
                '<div class="prov-field-full">' +
                    '<label>Ubigeo</label>' +
                    '<div class="prov-ubigeo-search">' +
                        '<input type="text" id="provUbigeoSearch" placeholder="Busque distrito, provincia o departamento..." autocomplete="off">' +
                        '<div class="prov-ubigeo-dropdown" id="provUbigeoDropdown"></div>' +
                    '</div>' +
                '</div>' +

                /* ---- FILA 5: Teléfono | Celular | Email ---- */
                '<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>' +

                /* ---- FILA 6: Contacto | Tel. Contacto | Estado ---- */
                '<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>Estado</label>' +
                    '<select id="provEstado" name="estado">' +
                        '<option value="1"' + (proveedor.estado === true || proveedor.estado == '1' ? ' selected' : '') + '>Activo</option>' +
                        '<option value="0"' + (proveedor.estado === false || proveedor.estado == '0' ? ' selected' : '') + '>Inactivo</option>' +
                    '</select></div>' +

                /* ---- DATOS TRIBUTARIOS ---- */
                '<div class="prov-separador"><span>Datos Tributarios</span></div>' +
                '<div class="prov-field-full">' +
                    '<div class="prov-toggle-row">' +
                        '<div class="prov-toggle-item' + (proveedor.detraccion ? ' activo' : '') + '">' +
                            '<label class="prov-switch"><input type="checkbox" id="provDetraccion"' + (proveedor.detraccion ? ' checked' : '') + '><span class="slider"></span></label>' +
                            '<label for="provDetraccion">Detracción</label></div>' +
                        '<div class="prov-toggle-item' + (proveedor.percepcion ? ' activo' : '') + '">' +
                            '<label class="prov-switch"><input type="checkbox" id="provPercepcion"' + (proveedor.percepcion ? ' checked' : '') + '><span class="slider"></span></label>' +
                            '<label for="provPercepcion">Percepción</label></div>' +
                        '<div class="prov-toggle-item' + (proveedor.retencion ? ' activo' : '') + '">' +
                            '<label class="prov-switch"><input type="checkbox" id="provRetencion"' + (proveedor.retencion ? ' checked' : '') + '><span class="slider"></span></label>' +
                            '<label for="provRetencion">Retención</label></div>' +
                        '<div class="prov-toggle-item' + (proveedor.agente_retencion ? ' activo' : '') + '">' +
                            '<label class="prov-switch"><input type="checkbox" id="provAgenteRet"' + (proveedor.agente_retencion ? ' checked' : '') + '><span class="slider"></span></label>' +
                            '<label for="provAgenteRet">Agente Retención</label></div>' +
                    '</div></div>' +

                /* ---- DATOS BANCARIOS Y COMERCIALES ---- */
                '<div class="prov-separador"><span>Datos Bancarios y Comerciales</span></div>' +
                '<div class="prov-field"><label>Banco</label>' +
                    '<select id="provBanco"><option value="">Seleccione...</option></select></div>' +
                '<div class="prov-field"><label>Cuenta Bancaria</label>' +
                    '<input type="text" id="provCuentaBancaria" maxlength="30" placeholder="N° de cuenta" value="' + (proveedor.cuenta_bancaria || '') + '"></div>' +
                '<div class="prov-field"><label>Condición de Pago</label>' +
                    '<select id="provCondicionPago"><option value="">Seleccione...</option></select></div>' +
                '<div class="prov-field"><label>Categoría</label>' +
                    '<select id="provCategoria"><option value="">Seleccione...</option></select></div>' +
                '<div class="prov-field-dos"><label>Notas / Observaciones</label>' +
                    '<textarea id="provNotas" maxlength="500" placeholder="Información adicional del proveedor...">' + (proveedor.notas || '') + '</textarea></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: '900px',
            contenido: html,
            onAbierto: function() {
                self.cargarTiposDocumento(proveedor.tipo_documento);
                self.cargarBancos(proveedor.id_banco);
                self.cargarCondicionesPago(proveedor.id_condicion);
                self.cargarCategorias(proveedor.id_categoria);
                if (!esNuevo) {
                    self.cargarUbigeoPorCodigo(proveedor.cod_ubigeo);
                }
                self.enlazarEventosFormulario(esNuevo);
            }
        });
    },

    enlazarEventosFormulario: function(esNuevo) {
        var self = this;
        var form = document.getElementById('provForm');
        var tipoDoc = document.getElementById('provTipoDoc');
        var btnCancelar = document.getElementById('provBtnCancelar');
        var numDoc = document.getElementById('provNumDoc');
        var ubigeoSearch = document.getElementById('provUbigeoSearch');

        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');
            });
        }

        if (numDoc) {
            numDoc.addEventListener('input', function() {
                self.ocultarError('provNumDoc');
            });
            numDoc.addEventListener('blur', function() {
                self.validarNumDoc();
            });
        }

        var btnSunat = document.getElementById('provBtnSunat');
        if (btnSunat) {
            btnSunat.addEventListener('click', function() {
                var ruc = document.getElementById('provNumDoc').value.replace(/\D/g, '');
                if (ruc.length !== 11) {
                    Mensaje.error({ titulo: 'Validación', texto: 'Ingrese un RUC de 11 dígitos para consultar SUNAT' });
                    return;
                }
                self.consultarSunat(ruc);
            });
        }

        if (ubigeoSearch) {
            var ubigeoTimer = null;
            ubigeoSearch.addEventListener('input', function() {
                clearTimeout(ubigeoTimer);
                var val = this.value.trim();
                if (val.length < 2) {
                    document.getElementById('provUbigeoDropdown').classList.remove('visible');
                    document.getElementById('provCodUbigeo').value = '';
                    return;
                }
                ubigeoTimer = setTimeout(function() {
                    self.buscarUbigeo(val);
                }, 300);
            });
            ubigeoSearch.addEventListener('blur', function() {
                setTimeout(function() {
                    document.getElementById('provUbigeoDropdown').classList.remove('visible');
                }, 200);
            });
            ubigeoSearch.addEventListener('focus', function() {
                var dd = document.getElementById('provUbigeoDropdown');
                if (dd.children.length > 0) {
                    dd.classList.add('visible');
                }
            });
        }

        // Toggle switches: actualizar clase visual al cambiar
        var toggles = document.querySelectorAll('.prov-switch input[type="checkbox"]');
        toggles.forEach(function(cb) {
            cb.addEventListener('change', function() {
                var item = this.closest('.prov-toggle-item');
                if (item) {
                    item.classList.toggle('activo', this.checked);
                }
            });
        });

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

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

    cargarDepartamentos: async function() {
        var select = document.getElementById('provDepartamento');
        if (!select) return;
        try {
            var res = await fetch(this.API_URL + '/ubigeo/departamentos');
            var data = await res.json();
            var html = '<option value="">Seleccione departamento...</option>';
            if (data.ok) {
                data.data.forEach(function(d) {
                    html += '<option value="' + d.cod_ubigeo + '">' + d.nombre + '</option>';
                });
            }
            select.innerHTML = html;
        } catch (error) {
            select.innerHTML = '<option value="">Error...</option>';
        }
    },

    cargarTiposDocumento: async function(valorActual) {
        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 == valorActual ? ' 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);
        }
    },

    cargarBancos: async function(valorActual) {
        var select = document.getElementById('provBanco');
        if (!select) return;
        try {
            var res = await fetch(this.API_URL + '/bancos');
            var data = await res.json();
            if (!data.ok) return;
            var html = '<option value="">Seleccione...</option>';
            data.data.forEach(function(b) {
                var sel = b.id_banco == valorActual ? ' selected' : '';
                html += '<option value="' + b.id_banco + '"' + sel + '>' + b.nombre + '</option>';
            });
            select.innerHTML = html;
        } catch (error) {
            console.error('[PROVEEDORES] Error cargar bancos:', error);
        }
    },

    cargarCondicionesPago: async function(valorActual) {
        var select = document.getElementById('provCondicionPago');
        if (!select) return;
        try {
            var res = await fetch(this.API_URL + '/condiciones-pago');
            var data = await res.json();
            if (!data.ok) return;
            var html = '<option value="">Seleccione...</option>';
            data.data.forEach(function(c) {
                var sel = c.id_condicion == valorActual ? ' selected' : '';
                html += '<option value="' + c.id_condicion + '"' + sel + '>' + c.nombre + '</option>';
            });
            select.innerHTML = html;
        } catch (error) {
            console.error('[PROVEEDORES] Error cargar condiciones:', error);
        }
    },

    cargarCategorias: async function(valorActual) {
        var select = document.getElementById('provCategoria');
        if (!select) return;
        try {
            var res = await fetch(this.API_URL + '/categorias-proveedor');
            var data = await res.json();
            if (!data.ok) return;
            var html = '<option value="">Seleccione...</option>';
            data.data.forEach(function(c) {
                var sel = c.id_categoria == valorActual ? ' selected' : '';
                html += '<option value="' + c.id_categoria + '"' + sel + '>' + c.nombre + '</option>';
            });
            select.innerHTML = html;
        } catch (error) {
            console.error('[PROVEEDORES] Error cargar categorías:', error);
        }
    },

    buscarUbigeo: async function(q) {
        var dd = document.getElementById('provUbigeoDropdown');
        if (!dd) return;
        try {
            var res = await fetch(this.API_URL + '/ubigeo/buscar?q=' + encodeURIComponent(q));
            var data = await res.json();
            if (!data.ok) {
                dd.innerHTML = '<div class="prov-ubigeo-dd-empty">Error: ' + (data.mensaje || 'sin respuesta del servidor') + '</div>';
                dd.classList.add('visible');
                return;
            }
            if (data.data.length === 0) {
                dd.innerHTML = '<div class="prov-ubigeo-dd-empty">Sin resultados. Verifique que la tabla ubigeo tenga datos.</div>';
                dd.classList.add('visible');
                return;
            }
            var html = '';
            data.data.forEach(function(u) {
                var label = u.departamento + ' / ' + u.provincia + ' / ' + u.distrito;
                html += '<div class="prov-ubigeo-dd-item" data-cod="' + u.cod_ubigeo + '" data-label="' + label + '">' +
                    '<span class="prov-ubigeo-dd-cod">' + u.cod_ubigeo + '</span>' +
                    '<span class="prov-ubigeo-dd-nombre">' + label + '</span>' +
                    '</div>';
            });
            dd.innerHTML = html;
            dd.classList.add('visible');

            dd.querySelectorAll('.prov-ubigeo-dd-item').forEach(function(item) {
                item.addEventListener('click', function() {
                    document.getElementById('provCodUbigeo').value = this.dataset.cod;
                    document.getElementById('provUbigeoSearch').value = this.dataset.label;
                    dd.classList.remove('visible');
                });
            });
        } catch (error) {
            console.error('[PROVEEDORES] Error buscar ubigeo:', error);
            dd.innerHTML = '<div class="prov-ubigeo-dd-empty">Error al buscar</div>';
            dd.classList.add('visible');
        }
    },

    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.cod_ubigeo + '">' + 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');
        var codUbigeoActual = document.getElementById('provCodUbigeo').value;
        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) {
                    var sel = d.cod_ubigeo === codUbigeoActual ? ' selected' : '';
                    html += '<option value="' + d.cod_ubigeo + '"' + sel + '>' + d.nombre + '</option>';
                });
            }
            select.innerHTML = html;
            select.disabled = false;
        } catch (error) {
            select.innerHTML = '<option value="">Error...</option>';
        }
    },

    cargarUbigeoPorCodigo: async function(codUbigeo) {
        if (!codUbigeo) return;
        try {
            var res = await fetch(this.API_URL + '/ubigeo/resolver/' + codUbigeo);
            var data = await res.json();
            if (!data.ok) return;
            var u = data.data;
            var label = u.departamento + ' / ' + u.provincia + ' / ' + u.distrito;
            document.getElementById('provCodUbigeo').value = codUbigeo;
            document.getElementById('provUbigeoSearch').value = label;
        } catch (error) {
            console.error('[PROVEEDORES] Error cargar ubigeo:', error);
        }
    },

    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');
    },

    validarRUC: function(ruc) {
        if (!/^\d{11}$/.test(ruc)) return false;
        var prefijo = ruc.substring(0, 2);
        if (['10', '15', '17', '20'].indexOf(prefijo) === -1) return false;
        var pesos = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
        var suma = 0;
        for (var i = 0; i < 10; i++) {
            suma += parseInt(ruc.charAt(i)) * pesos[i];
        }
        var digito = 11 - (suma % 11);
        if (digito === 11) digito = 1;
        if (digito === 10) digito = 0;
        return digito === parseInt(ruc.charAt(10));
    },

    validarNumDoc: function() {
        var numDoc = document.getElementById('provNumDoc');
        var tipoDoc = document.getElementById('provTipoDoc');
        if (!numDoc || !tipoDoc) return true;

        var numVal = numDoc.value.trim();
        var tipo = tipoDoc.value;
        var valido = true;

        if (numVal) {
            if (tipo === '6') {
                if (!/^\d{11}$/.test(numVal)) {
                    this.mostrarError('provNumDoc', 'El RUC debe tener 11 dígitos');
                    valido = false;
                } else if (!this.validarRUC(numVal)) {
                    this.mostrarError('provNumDoc', 'El RUC ingresado no es válido');
                    valido = false;
                } else {
                    this.ocultarError('provNumDoc');
                }
            } else if (tipo === '1') {
                if (!/^\d{8}$/.test(numVal)) {
                    this.mostrarError('provNumDoc', 'El DNI debe tener 8 dígitos');
                    valido = false;
                } else {
                    this.ocultarError('provNumDoc');
                }
            } else {
                this.ocultarError('provNumDoc');
            }
        } else {
            this.ocultarError('provNumDoc');
        }
        return valido;
    },

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

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

        if (!this.validarNumDoc()) {
            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...';

        function up(str) { return str ? str.toUpperCase() : null; }

        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: up(document.getElementById('provRazonSocial').value.trim()),
            direccion: up(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().toLowerCase() || null,
            contacto_nombre: up(document.getElementById('provContacto').value.trim()) || null,
            contacto_telefono: document.getElementById('provTelContacto').value.trim() || null,
            tipo_proveedor: document.getElementById('provTipoProv').value,
            detraccion: document.getElementById('provDetraccion').checked,
            percepcion: document.getElementById('provPercepcion').checked,
            retencion: document.getElementById('provRetencion').checked,
            agente_retencion: document.getElementById('provAgenteRet').checked,
            id_banco: parseInt(document.getElementById('provBanco').value) || null,
            cuenta_bancaria: document.getElementById('provCuentaBancaria').value.trim() || null,
            id_condicion: parseInt(document.getElementById('provCondicionPago').value) || null,
            id_categoria: parseInt(document.getElementById('provCategoria').value) || null,
            notas: document.getElementById('provNotas').value.trim() || null,
            estado: parseInt(document.getElementById('provEstado').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' });
                }
            }
        });
    },

    consultarSunat: async function(ruc) {
        var btn = document.getElementById('provBtnSunat');
        btn.classList.add('loading');
        btn.textContent = 'Consultando...';

        try {
            var response = await fetch(this.API_URL + '/sunat/consultar-ruc/' + ruc);
            var res = await response.json();

            if (res.ok) {
                document.getElementById('provRazonSocial').value = res.data.razon_social || '';
                document.getElementById('provDireccion').value = res.data.direccion || '';

                if (res.data.cod_ubigeo) {
                    document.getElementById('provCodUbigeo').value = res.data.cod_ubigeo;
                    var self = this;
                    self.cargarUbigeoPorCodigo(res.data.cod_ubigeo);
                }

                if (res.data.razon_social) {
                    Mensaje.exito({
                        titulo: 'Datos obtenidos',
                        texto: 'Se obtuvo datos de SUNAT correctamente',
                        autocerrar: true,
                        autocerrarSegundos: 2000
                    });
                }
            } else {
                Mensaje.error({ titulo: 'SUNAT', texto: res.mensaje });
            }
        } catch (error) {
            Mensaje.error({ titulo: 'SUNAT', texto: 'Error al consultar SUNAT: ' + (error.message || 'sin conexión') });
        }

        btn.classList.remove('loading');
        btn.textContent = 'SUNAT';
    }
};

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