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

Proveedores.configPersonalizado = {
    title: 'Proveedores',
    icon: 'fa-truck-field',
    idSingular: 'Proveedor',
    idField: 'id_proveedor',
    endpoint: '/proveedores',
    sortDefault: 'cod_proveedor',
    limite: 50,
    searchPlaceholder: 'Buscar razón social, RUC o código...',
    filtroEstado: true,
    showEstado: true,
    showAcciones: true,
    exportFileName: 'Proveedores',
    elementId: 'pageProveedores',
    estadoOpciones: [
        { value: '1', text: 'Activos' },
        { value: '0', text: 'Inactivos' },
        { value: '', text: 'Todos' }
    ],
    columns: [
        { field: 'cod_proveedor', label: 'Código', sortable: true, filterable: false, width: '80px', className: 'col-codigo' },
        { field: 'razon_social', label: 'Razón Social', sortable: true, filterable: true, className: 'col-razon' },
        { field: 'num_documento', label: 'Documento', sortable: true, filterable: false, className: 'col-doc',
            render: function(r) { return r.num_documento || ''; } },
        { field: 'contacto_nombre', label: 'Contacto', sortable: true, filterable: true, className: 'col-contacto',
            render: function(r) { return r.contacto_nombre || ''; } },
        { field: 'telefono', label: 'Teléfono', sortable: true, filterable: true,
            render: function(r) { return r.telefono || r.celular || ''; } },
        { field: 'categoria_nombre', label: 'Categoría', sortable: true, filterable: true, className: 'col-categoria' },
        { field: 'estado', label: 'Estado', sortable: true, filterable: true,
            render: function(r) {
                return r.estado
                    ? '<span class="prov-badge prov-badge-activo"><span class="prov-badge-dot"></span>Activo</span>'
                    : '<span class="prov-badge prov-badge-inactivo"><span class="prov-badge-dot"></span>Inactivo</span>';
            }
        }
    ],
    // Columnas específicas para filtros columna
    columnFilters: {
        razon_social: 'texto',
        contacto_nombre: 'texto',
        telefono: 'texto',
        categoria: 'categoria',
        estado: 'estado'
    },
    renderFormulario: function() {
        return '<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\u00b0 Documento</label>' +
                    '<div class="prov-input-group">' +
                        '<input type="text" id="provNumDoc" name="num_documento" maxlength="20" placeholder="Ingrese n\u00famero">' +
                        '<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">Nacional</option>' +
                        '<option value="2">Extranjero</option>' +
                    '</select></div>' +
                '<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" 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"></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>' +
                '<div class="prov-field"><label>Teléfono</label>' +
                    '<input type="text" id="provTelefono" name="telefono" maxlength="20" placeholder="Fijo"></div>' +
                '<div class="prov-field"><label>Celular</label>' +
                    '<input type="text" id="provCelular" name="celular" maxlength="20" placeholder="Móvil"></div>' +
                '<div class="prov-field"><label>Email</label>' +
                    '<input type="email" id="provEmail" name="email" maxlength="40" placeholder="correo@ejemplo.com"></div>' +
                '<div class="prov-field"><label>Persona de Contacto</label>' +
                    '<input type="text" id="provContacto" name="contacto_nombre" maxlength="60" placeholder="Nombre"></div>' +
                '<div class="prov-field"><label>Tel. Contacto</label>' +
                    '<input type="text" id="provTelContacto" name="contacto_telefono" maxlength="20" placeholder="Teléfono"></div>' +
                '<div class="prov-field"><label>Estado</label>' +
                    '<select id="provEstado" name="estado">' +
                        '<option value="1">Activo</option>' +
                        '<option value="0">Inactivo</option>' +
                    '</select></div>' +
                '<div class="prov-separador"><span>Datos Tributarios</span></div>' +
                '<div class="prov-field-full">' +
                    '<div class="prov-toggle-row">' +
                        '<div class="prov-toggle-item"><label class="prov-switch"><input type="checkbox" id="provDetraccion"><span class="slider"></span></label><label for="provDetraccion">Detracción</label></div>' +
                        '<div class="prov-toggle-item"><label class="prov-switch"><input type="checkbox" id="provPercepcion"><span class="slider"></span></label><label for="provPercepcion">Percepción</label></div>' +
                        '<div class="prov-toggle-item"><label class="prov-switch"><input type="checkbox" id="provRetencion"><span class="slider"></span></label><label for="provRetencion">Retención</label></div>' +
                        '<div class="prov-toggle-item"><label class="prov-switch"><input type="checkbox" id="provAgenteRet"><span class="slider"></span></label><label for="provAgenteRet">Agente Retención</label></div>' +
                    '</div></div>' +
                '<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"></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..."></textarea></div>' +
            '</div>' +
            '<button type="submit" style="display:none" id="provBtnGuardar">Guardar</button>' +
            '<input type="hidden" id="provId" value="">' +
            '<input type="hidden" id="provCodUbigeo" value="">' +
            '<input type="hidden" id="provCreadoPor" value="">' +
            '<input type="hidden" id="provIdEmpresa" value="">' +
        '</form>';
    }
};

Proveedores.init(Proveedores.configPersonalizado);

// Sobrescribir abrirModal con la versión compleja de Proveedores
Proveedores.abrirModal = async function(idProveedor) {
    var self = this;
    var esNuevo = !idProveedor;
    var titulo = esNuevo ? 'Nuevo Proveedor' : 'Editar Proveedor';

    var contenido = '<div class="prov-modal-form">';
    contenido += this.renderFormulario(null);
    contenido += '</div>';

    Modal.abrir({
        titulo: titulo,
        ancho: '900px',
        contenido: contenido,
        onAbierto: function() {
            document.getElementById('provId').value = idProveedor || '';
            document.getElementById('provCreadoPor').value = self.sesion ? self.sesion.id_usuario : '';
            document.getElementById('provIdEmpresa').value = self.sesion ? self.sesion.id_empresa : '';

            self.cargarTiposDocumento('6');
            self.cargarBancos(null);
            self.cargarCondicionesPago(null);
            self.cargarCategorias(null);
            self.enlazarEventosFormulario(esNuevo);

            if (!esNuevo) self.cargarDatosProveedor(idProveedor);
        },
        botones: [
            { texto: 'Cancelar', tipo: 'secundario', accion: function() { Modal.cerrar(); } },
            { texto: 'Guardar', tipo: 'primario', accion: function() { self.guardarProveedor(); } }
        ]
    });
};

Proveedores.cargarDatosProveedor = async function(idProveedor) {
    try {
        var res = await fetch(this.API_URL + '/proveedores/' + idProveedor + '?id_empresa=' + (this.sesion ? this.sesion.id_empresa : ''));
        var data = await res.json();
        if (!data.ok) { Mensaje.error({ titulo: 'Error', texto: data.mensaje }); return; }
        var p = data.data;

        document.getElementById('provId').value = p.id_proveedor || '';
        document.getElementById('provNumDoc').value = p.num_documento || '';
        document.getElementById('provRazonSocial').value = p.razon_social || '';
        document.getElementById('provDireccion').value = p.direccion || '';
        document.getElementById('provTelefono').value = p.telefono || '';
        document.getElementById('provCelular').value = p.celular || '';
        document.getElementById('provEmail').value = p.email || '';
        document.getElementById('provContacto').value = p.contacto_nombre || '';
        document.getElementById('provTelContacto').value = p.contacto_telefono || '';
        document.getElementById('provTipoProv').value = p.tipo_proveedor || '1';
        document.getElementById('provEstado').value = p.estado ? '1' : '0';
        document.getElementById('provCuentaBancaria').value = p.cuenta_bancaria || '';
        document.getElementById('provNotas').value = p.notas || '';
        document.getElementById('provCodUbigeo').value = p.cod_ubigeo || '';

        document.getElementById('provDetraccion').checked = !!p.detraccion;
        document.getElementById('provPercepcion').checked = !!p.percepcion;
        document.getElementById('provRetencion').checked = !!p.retencion;
        document.getElementById('provAgenteRet').checked = !!p.agente_retencion;
        document.querySelectorAll('.prov-toggle-item').forEach(function(item) {
            var cb = item.querySelector('input[type="checkbox"]');
            if (cb) item.classList.toggle('activo', cb.checked);
        });

        this.cargarTiposDocumento(p.tipo_documento);
        this.cargarBancos(p.id_banco);
        this.cargarCondicionesPago(p.id_condicion);
        this.cargarCategorias(p.id_categoria);
        this.cargarUbigeoPorCodigo(p.cod_ubigeo);
    } catch (error) {
        Mensaje.error({ titulo: 'Error', texto: 'No se pudo cargar el proveedor' });
    }
};

Proveedores.guardarProveedor = function() {
    var id = document.getElementById('provId').value;
    var body = {
        id_proveedor: id || null,
        id_empresa: parseInt(document.getElementById('provIdEmpresa').value),
        id_sucursal: this.sesion ? this.sesion.id_sucursal || null : null,
        tipo_documento: document.getElementById('provTipoDoc').value,
        num_documento: document.getElementById('provNumDoc').value.trim(),
        razon_social: document.getElementById('provRazonSocial').value.trim(),
        direccion: document.getElementById('provDireccion').value.trim(),
        cod_ubigeo: document.getElementById('provCodUbigeo').value,
        telefono: document.getElementById('provTelefono').value.trim(),
        celular: document.getElementById('provCelular').value.trim(),
        email: document.getElementById('provEmail').value.trim(),
        contacto_nombre: document.getElementById('provContacto').value.trim(),
        contacto_telefono: document.getElementById('provTelContacto').value.trim(),
        tipo_proveedor: document.getElementById('provTipoProv').value,
        estado: document.getElementById('provEstado').value === '1',
        detraccion: document.getElementById('provDetraccion').checked,
        percepcion: document.getElementById('provPercepcion').checked,
        retencion: document.getElementById('provRetencion').checked,
        agente_retencion: document.getElementById('provAgenteRet').checked,
        id_banco: document.getElementById('provBanco').value || null,
        cuenta_bancaria: document.getElementById('provCuentaBancaria').value.trim(),
        id_condicion: document.getElementById('provCondicionPago').value || null,
        id_categoria: document.getElementById('provCategoria').value || null,
        notas: document.getElementById('provNotas').value.trim(),
        creado_por: parseInt(document.getElementById('provCreadoPor').value)
    };

    if (!body.razon_social) {
        Mensaje.error({ titulo: 'Validación', texto: 'La razón social es requerida' });
        return;
    }

    var metodo = id ? 'PUT' : 'POST';
    var url = this.API_URL + '/proveedores';

    fetch(url, {
        method: metodo,
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(body)
    })
    .then(function(r) { return r.json(); })
    .then(function(res) {
        if (res.ok) {
            Mensaje.exito({ titulo: 'Guardado', texto: res.mensaje });
            Modal.cerrar();
            this.paginaActual = 1;
            this.cargarTabla();
        } else {
            Mensaje.error({ titulo: 'Error', texto: res.mensaje });
        }
    }.bind(this))
    .catch(function() {
        Mensaje.error({ titulo: 'Error', texto: 'Error al guardar proveedor' });
    });
};

// ========== MÉTODOS AUXILIARES DEL FORMULARIO ==========

Proveedores.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');
            var err = document.getElementById('provNumDocError');
            if (err) err.textContent = '';
        });
    }

    if (numDoc) {
        numDoc.addEventListener('input', function() {
            var err = document.getElementById('provNumDocError');
            if (err) err.textContent = '';
        });
    }

    var btnSunat = document.getElementById('provBtnSunat');
    if (btnSunat) {
        btnSunat.addEventListener('click', function() {
            var tipoDoc = document.getElementById('provTipoDoc');
            var numDoc = document.getElementById('provNumDoc');
            var num = numDoc.value.replace(/\D/g, '');
            var tipo = tipoDoc ? tipoDoc.value : '6';
            if (tipo === '6') {
                if (num.length !== 11) {
                    Mensaje.error({ titulo: 'Validación', texto: 'Ingrese un RUC de 11 dígitos para consultar SUNAT' });
                    return;
                }
                if (!self.validarRuc(num)) {
                    Mensaje.error({ titulo: 'Validación', texto: 'El RUC ingresado no es válido (dígito verificador incorrecto)' });
                    return;
                }
                self.consultarSunat(num);
            } else if (tipo === '1') {
                if (num.length !== 8) {
                    Mensaje.error({ titulo: 'Validación', texto: 'Ingrese un DNI de 8 dígitos para consultar' });
                    return;
                }
                self.consultarDni(num);
            } else {
                Mensaje.error({ titulo: 'Validación', texto: 'Seleccione RUC o DNI para consultar' });
            }
        });
    }

    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 && dd.children.length > 0) dd.classList.add('visible');
        });
    }

    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.guardarProveedor();
        });
    }
};

Proveedores.cargarTiposDocumento = async function(valorActual) {
    var select = document.getElementById('provTipoDoc');
    if (!select) return;
    try {
        var res = await fetch(this.API_URL + '/tipos-documento?id_empresa=' + (this.sesion ? this.sesion.id_empresa : '') + (this.sesion && this.sesion.id_sucursal ? '&id_sucursal=' + this.sesion.id_sucursal : ''));
        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 tipos doc:', error); }
};

Proveedores.cargarBancos = async function(valorActual) {
    var select = document.getElementById('provBanco');
    if (!select) return;
    try {
        var res = await fetch(this.API_URL + '/bancos?id_empresa=' + (this.sesion ? this.sesion.id_empresa : '') + '&estado=1' + (this.sesion && this.sesion.id_sucursal ? '&id_sucursal=' + this.sesion.id_sucursal : ''));
        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 bancos:', error); }
};

Proveedores.cargarCondicionesPago = async function(valorActual) {
    var select = document.getElementById('provCondicionPago');
    if (!select) return;
    try {
        var res = await fetch(this.API_URL + '/condiciones-pago?id_empresa=' + (this.sesion ? this.sesion.id_empresa : '') + '&estado=1' + (this.sesion && this.sesion.id_sucursal ? '&id_sucursal=' + this.sesion.id_sucursal : ''));
        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 condiciones:', error); }
};

Proveedores.cargarCategorias = async function(valorActual) {
    var select = document.getElementById('provCategoria');
    if (!select) return;
    try {
        var res = await fetch(this.API_URL + '/categorias-proveedor?id_empresa=' + (this.sesion ? this.sesion.id_empresa : '') + '&estado=1' + (this.sesion && this.sesion.id_sucursal ? '&id_sucursal=' + this.sesion.id_sucursal : ''));
        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 categorías:', error); }
};

Proveedores.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') + '</div>'; dd.classList.add('visible'); return; }
        if (data.data.length === 0) { dd.innerHTML = '<div class="prov-ubigeo-dd-empty">Sin resultados</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-codigo="' + u.cod_ubigeo + '" data-label="' + label.replace(/"/g, '&quot;') + '">' + label + '</div>';
        });
        dd.innerHTML = html;
        dd.classList.add('visible');
        dd.querySelectorAll('.prov-ubigeo-dd-item').forEach(function(item) {
            item.addEventListener('click', function() {
                var search = document.getElementById('provUbigeoSearch');
                search.value = this.dataset.label;
                document.getElementById('provCodUbigeo').value = this.dataset.codigo;
                dd.classList.remove('visible');
            });
        });
    } catch (error) { dd.innerHTML = '<div class="prov-ubigeo-dd-empty">Error de conexión</div>'; dd.classList.add('visible'); }
};

Proveedores.cargarUbigeoPorCodigo = async function(codigo) {
    if (!codigo || !String(codigo).trim()) return;
    try {
        var res = await fetch(this.API_URL + '/ubigeo/resolver/' + codigo);
        var data = await res.json();
        if (data.ok && data.data) {
            var search = document.getElementById('provUbigeoSearch');
            if (search) search.value = data.data.departamento + ' / ' + data.data.provincia + ' / ' + data.data.distrito;
        }
    } catch (error) {}
};

Proveedores.validarRuc = function(ruc) {
    if (!ruc || ruc.length !== 11 || !/^\d+$/.test(ruc)) return false;
    var suma = 0, x = 6;
    for (var i = 0; i < 10; i++) {
        if (i === 4) x = 8;
        var digito = parseInt(ruc.charAt(i));
        x--;
        suma += digito * x;
    }
    var resto = (11 - (suma % 11)) % 10;
    return resto === parseInt(ruc.charAt(10));
};

Proveedores.consultarSunat = async function(ruc) {
    try {
        var res = await fetch(this.API_URL + '/sunat/consultar-ruc/' + ruc);
        var data = await res.json();
        if (data.ok && data.data) {
            if (data.data.razon_social) document.getElementById('provRazonSocial').value = data.data.razon_social;
            if (data.data.direccion) document.getElementById('provDireccion').value = data.data.direccion;
            if (data.data.cod_ubigeo) {
                document.getElementById('provCodUbigeo').value = data.data.cod_ubigeo;
                Proveedores.cargarUbigeoPorCodigo(data.data.cod_ubigeo);
            }
            Mensaje.exito({ titulo: 'SUNAT', texto: 'Datos obtenidos correctamente' });
        } else {
            Mensaje.error({ titulo: 'SUNAT', texto: data.mensaje || 'No se encontraron datos' });
        }
    } catch (error) {
        Mensaje.error({ titulo: 'SUNAT', texto: 'Error al consultar SUNAT' });
    }
};

Proveedores.consultarDni = async function(dni) {
    try {
        var res = await fetch(this.API_URL + '/sunat/consultar-dni/' + dni);
        var data = await res.json();
        if (data.ok && data.data) {
            if (data.data.razon_social) document.getElementById('provRazonSocial').value = data.data.razon_social;
            Mensaje.exito({ titulo: 'Consulta DNI', texto: 'Nombre obtenido correctamente' });
        } else {
            Mensaje.error({ titulo: 'Consulta DNI', texto: data.mensaje || 'No se encontraron datos' });
        }
    } catch (error) {
        Mensaje.error({ titulo: 'Consulta DNI', texto: 'Error al consultar DNI' });
    }
};

// Sobrescribir verDetalle con la versión detallada de Proveedores
Proveedores.verDetalle = async function(idProveedor) {
    try {
        var response = await fetch(this.API_URL + '/proveedores/' + idProveedor + '?id_empresa=' + (this.sesion ? this.sesion.id_empresa : ''));
        var res = await response.json();
        if (!res.ok) { Mensaje.error({ titulo: 'Error', texto: res.mensaje }); return; }
        var p = res.data;

        var s = function(v) { return v || '-'; };
        var sn = function(v) { return v ? 'Sí' : 'No'; };

        var html = '<div class="prov-detalle">' +
            '<div class="prov-detalle-grid">' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Código</span><span class="prov-detalle-valor">' + s(p.cod_proveedor) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Razón Social</span><span class="prov-detalle-valor">' + s(p.razon_social) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Tipo Documento</span><span class="prov-detalle-valor">' + (p.tipo_documento === '6' ? 'RUC' : p.tipo_documento === '1' ? 'DNI' : p.tipo_documento) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">N° Documento</span><span class="prov-detalle-valor">' + s(p.num_documento) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Dirección</span><span class="prov-detalle-valor">' + s(p.direccion) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Teléfono</span><span class="prov-detalle-valor">' + s(p.telefono) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Celular</span><span class="prov-detalle-valor">' + s(p.celular) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Email</span><span class="prov-detalle-valor">' + s(p.email) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Contacto</span><span class="prov-detalle-valor">' + s(p.contacto_nombre) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Tel. Contacto</span><span class="prov-detalle-valor">' + s(p.contacto_telefono) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Tipo Proveedor</span><span class="prov-detalle-valor">' + (p.tipo_proveedor === '1' ? 'Nacional' : p.tipo_proveedor === '2' ? 'Extranjero' : '-') + '</span></div>' +
            '</div>' +
            '<div class="prov-detalle-separador"><span>Datos Tributarios</span></div>' +
            '<div class="prov-detalle-grid">' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Detracción</span><span class="prov-detalle-valor">' + sn(p.detraccion) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Percepción</span><span class="prov-detalle-valor">' + sn(p.percepcion) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Retención</span><span class="prov-detalle-valor">' + sn(p.retencion) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Agente Retención</span><span class="prov-detalle-valor">' + sn(p.agente_retencion) + '</span></div>' +
            '</div>' +
            '<div class="prov-detalle-separador"><span>Datos Bancarios y Comerciales</span></div>' +
            '<div class="prov-detalle-grid">' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Banco</span><span class="prov-detalle-valor">' + s(p.banco_nombre) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Cuenta Bancaria</span><span class="prov-detalle-valor">' + s(p.cuenta_bancaria) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Condición de Pago</span><span class="prov-detalle-valor">' + s(p.condicion_nombre) + '</span></div>' +
                '<div class="prov-detalle-campo"><span class="prov-detalle-label">Categoría</span><span class="prov-detalle-valor">' + s(p.categoria_nombre) + '</span></div>' +
                '<div class="prov-detalle-campo prov-detalle-campo-full"><span class="prov-detalle-label">Notas</span><span class="prov-detalle-valor">' + s(p.notas) + '</span></div>' +
            '</div>' +
        '</div>';

        Modal.abrir({
            titulo: 'Detalle del Proveedor',
            ancho: '800px',
            contenido: html,
            botones: [
                {
                    texto: 'Imprimir', tipo: 'secundario', accion: function() {
                        var empresa = Proveedores.sesion && Proveedores.sesion.empresa_razon ? Proveedores.sesion.empresa_razon : '';
                        var ahora = new Date();
                        var fechaHora = ahora.toLocaleDateString('es-PE', { day: '2-digit', month: '2-digit', year: 'numeric' }) + ' ' + ahora.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });
                        var lineas =
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Código</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.cod_proveedor) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Razón Social</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.razon_social) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Documento</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + (p.tipo_documento === '6' ? 'RUC' : p.tipo_documento === '1' ? 'DNI' : s(p.tipo_documento)) + ': ' + s(p.num_documento) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Dirección</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.direccion) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Teléfono</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.telefono) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Celular</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.celular) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Email</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.email) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Contacto</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.contacto_nombre) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Tel. Contacto</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.contacto_telefono) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Tipo Proveedor</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + (p.tipo_proveedor === '1' ? 'Nacional' : p.tipo_proveedor === '2' ? 'Extranjero' : '-') + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Detracción</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + sn(p.detraccion) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Percepción</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + sn(p.percepcion) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Retención</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + sn(p.retencion) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Agente Retención</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + sn(p.agente_retencion) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Banco</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.banco_nombre) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Cuenta Bancaria</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.cuenta_bancaria) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Condición Pago</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.condicion_nombre) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Categoría</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.categoria_nombre) + '</td></tr>' +
                            '<tr><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;font-weight:600;color:#475569;width:160px;font-size:0.75rem">Notas</td><td style="padding:6px 10px;border-bottom:1px solid #E2E8F0;color:#1E293B;font-size:0.78rem">' + s(p.notas) + '</td></tr>';
                        var fullHtml = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Proveedor</title>' +
                            '<link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">' +
                            '<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:"Plus Jakarta Sans",sans-serif;padding:30px 40px;color:#1E293B}.header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid #1A4480}.empresa{font-size:0.65rem;font-weight:600;color:#475569;margin-top:2px}.titulo{font-size:1.2rem;font-weight:800;color:#1A4480;text-transform:uppercase;letter-spacing:0.5px}.fecha{font-size:0.65rem;color:#64748B;text-align:right;margin-bottom:4px}table{width:100%;border-collapse:collapse;margin-top:12px}.footer{text-align:center;font-size:0.65rem;color:#94A3B8;margin-top:20px;border-top:1px solid #E2E8F0;padding-top:8px}@page{margin:12mm}</style></head><body>' +
                            '<div class="header"><div class="header-left"><div class="titulo">Proveedor</div>' + (empresa ? '<div class="empresa">' + empresa + '</div>' : '') + '</div><div class="fecha">' + fechaHora + '</div></div>' +
                            '<table>' + lineas + '</table>' +
                            '<div class="footer">NexusERP</div></body></html>';
                        var oldFrame = document.getElementById('prov-print-frame');
                        if (oldFrame) document.body.removeChild(oldFrame);
                        var iframe = document.createElement('iframe');
                        iframe.id = 'prov-print-frame';
                        iframe.style.cssText = 'position:absolute;width:1px;height:1px;opacity:0.01;top:-9999px;left:-9999px';
                        iframe.srcdoc = fullHtml;
                        document.body.appendChild(iframe);
                        iframe.onload = function() {
                            setTimeout(function() {
                                try { iframe.contentWindow.print(); } catch(e) {}
                            }, 1500);
                        };
                    }
                },
                { texto: 'Cerrar', tipo: 'primario', accion: function() { Modal.cerrar(); } }
            ]
        });
    } catch (error) {
        Mensaje.error({ titulo: 'Error', texto: 'No se pudo obtener el detalle' });
    }
};
