const db = require('../config/db');
const fs = require('fs');
const path = require('path');

var CARPETA_DATOS = 'C:\\Users\\Sistemas\\AppData\\Local\\Temp\\opencode';

function limpiarDescripcion(texto) {
    return texto
        .replace(/\r?\n|\r/g, ' ')
        .replace(/\s+/g, ' ')
        .trim()
        .replace(/'/g, "''");
}

function leerArchivo(ruta, sector) {
    if (!fs.existsSync(ruta)) {
        console.log('[SEED] Archivo no encontrado:', ruta);
        return [];
    }
    var contenido = fs.readFileSync(ruta, 'utf8');
    var lineas = contenido.split('\n');
    var registros = [];

    for (var i = 0; i < lineas.length; i++) {
        var linea = lineas[i].trim();
        if (!linea) continue;
        var partes = linea.split('|');
        if (partes.length < 2) continue;
        var codigo = partes[0].trim();
        var nombre = limpiarDescripcion(partes[1] || '');
        if (!codigo || !nombre) continue;
        registros.push({ codigo: codigo, nombre: nombre, sector: sector });
    }
    return registros;
}

async function seedSunatCargos() {
    try {
        console.log('[SEED SUNAT CARGOS] Conectando a la base de datos...');
        await db.getPool();

        console.log('[SEED SUNAT CARGOS] Creando tabla sunat_cargos...');
        await db.execute(`
            IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.sunat_cargos') AND type = 'U')
            CREATE TABLE sunat_cargos (
                id_cargo_sunat INT IDENTITY(1,1) PRIMARY KEY,
                codigo VARCHAR(10) NOT NULL,
                nombre VARCHAR(500) NOT NULL,
                sector VARCHAR(10) NOT NULL CHECK (sector IN ('PRIVADO', 'PUBLICO'))
            )
        `);

        await db.execute('TRUNCATE TABLE sunat_cargos');

        var archivoPrivado = path.join(CARPETA_DATOS, 'tabla30_ocupacion_sprivado.txt');
        var archivoPublico = path.join(CARPETA_DATOS, 'tabla10_ocupacion_spublico.txt');

        var todos = leerArchivo(archivoPrivado, 'PRIVADO')
            .concat(leerArchivo(archivoPublico, 'PUBLICO'));

        console.log('[SEED SUNAT CARGOS] Total registros a insertar: ' + todos.length);

        var BATCH_SIZE = 500;
        for (var i = 0; i < todos.length; i += BATCH_SIZE) {
            var batch = todos.slice(i, i + BATCH_SIZE);
            var values = [];
            var params = {};

            for (var j = 0; j < batch.length; j++) {
                var idx = i + j;
                values.push('(@cod_' + idx + ', @nom_' + idx + ', @sec_' + idx + ')');
                params['cod_' + idx] = { type: db.sql.VarChar(10), value: batch[j].codigo };
                params['nom_' + idx] = { type: db.sql.VarChar(500), value: batch[j].nombre };
                params['sec_' + idx] = { type: db.sql.VarChar(10), value: batch[j].sector };
            }

            var sql = 'INSERT INTO sunat_cargos (codigo, nombre, sector) VALUES ' + values.join(',');
            await db.execute(sql, params);
            console.log('[SEED] Lote ' + (i / BATCH_SIZE + 1) + ': ' + batch.length + ' registros insertados');
        }

        var verif = await db.query('SELECT COUNT(*) as total FROM sunat_cargos');
        console.log('[SEED SUNAT CARGOS] Total en tabla: ' + verif[0].total);
        console.log('[SEED SUNAT CARGOS] ¡Completado!');
        process.exit(0);
    } catch (error) {
        console.error('[SEED SUNAT CARGOS] Error:', error.message);
        process.exit(1);
    }
}

seedSunatCargos();
