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

var ID_EMPRESA = 1;
var CANTIDAD = 200;

var NOMBRES_MASC = ['JUAN', 'CARLOS', 'JOSÉ', 'MANUEL', 'LUIS', 'PEDRO', 'MIGUEL', 'JORGE', 'ALBERTO', 'RAÚL', 'VÍCTOR', 'ANDRÉS', 'DIEGO', 'HUGO', 'OSCAR', 'IVÁN', 'MARCO', 'FERNANDO', 'RICARDO', 'GABRIEL'];
var NOMBRES_FEM = ['MARÍA', 'CARMEN', 'ANA', 'LUCÍA', 'LAURA', 'ROSA', 'ELENA', 'SOFÍA', 'ISABEL', 'PAULA', 'ANDREA', 'CLAUDIA', 'MÓNICA', 'VERÓNICA', 'PATRICIA', 'SANDRA', 'LILIANA', 'KATHERINE', 'VALERIA', 'ANGÉLICA'];
var APELLIDOS = ['GARCÍA', 'RODRÍGUEZ', 'MARTÍNEZ', 'LÓPEZ', 'GONZÁLES', 'PÉREZ', 'SÁNCHEZ', 'RAMÍREZ', 'TORRES', 'FLORES', 'CASTILLO', 'CRUZ', 'REYES', 'MORALES', 'GUTIÉRREZ', 'ORTEGA', 'SILVA', 'VARGAS', 'ROMERO', 'DÍAZ', 'RAMOS', 'VEGA', 'ÁLVAREZ', 'RIVERA', 'CAMPOS', 'ROJAS', 'HERRERA', 'MEDINA', 'CÓRDOVA', 'GUZMÁN'];
var AREAS = ['ADMINISTRACIÓN', 'VENTAS', 'PRODUCCIÓN', 'LOGÍSTICA', 'CONTABILIDAD', 'RECURSOS HUMANOS', 'SISTEMAS', 'ALMACÉN', 'DIRECCIÓN', 'MARKETING', 'ATENCIÓN AL CLIENTE', 'CALIDAD', 'MANTENIMIENTO', 'SEGURIDAD', 'LEGAL'];
var DIRECCIONES = ['AV LOS OLIVOS 123', 'JR LIMA 456', 'CALLE REAL 789', 'AV PRINCIPAL 321', 'PASAJE SOL 654', 'AV LUNA 987', 'CALLE SOL 147', 'AV PROGRESO 258', 'JR UNION 369', 'AV PAZ 741'];
var LICENCIAS = ['A8582736', 'B7391047', 'C6209358', 'D5018269', 'E3827130', 'AX537291', 'BX648302', 'CX759413', 'DX860524', 'EX971635'];

function randomElem(arr) { return arr[Math.floor(Math.random() * arr.length)]; }
function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }

function randomDoc(type) {
    if (type === '1') { var n = ''; for (var i = 0; i < 8; i++) n += randomInt(0, 9); return n; }
    else if (type === '6') { var ruc = '20'; for (var i = 0; i < 8; i++) ruc += randomInt(0, 9); ruc += randomInt(0, 1).toString(); return ruc; }
    else { var doc = ''; for (var i = 0; i < 12; i++) doc += randomInt(0, 9); return doc; }
}

function generatePerson() {
    var masc = Math.random() > 0.5;
    var nombre = randomElem(masc ? NOMBRES_MASC : NOMBRES_FEM);
    var apellido1 = randomElem(APELLIDOS);
    var apellido2 = randomElem(APELLIDOS);
    var completo = nombre + ' ' + apellido1 + ' ' + apellido2;
    var tiposDoc = ['1', '1', '1', '1', '6', '7'];
    var tipoDoc = randomElem(tiposDoc);
    return { nombre: completo, tipoDoc: tipoDoc, numDoc: randomDoc(tipoDoc) };
}

function toDateStr(d) { return d.toISOString().split('T')[0]; }

async function main() {
    console.log('========================================');
    console.log('  DATOS DE PRUEBA: Empleados, Vendedores, Choferes');
    console.log('  Empresa ID: ' + ID_EMPRESA + ', ' + CANTIDAD + ' c/u');
    console.log('========================================\n');

    // Obtener IDs de cargos activos
    console.log('[PRE] Obteniendo cargos activos...');
    var cargoRows = await db.query('SELECT id_cargo FROM cargos WHERE id_empresa = @id AND estado = 1', { id: { type: db.sql.Int, value: ID_EMPRESA } });
    var cargoIds = cargoRows.map(function(r) { return r.id_cargo; });
    console.log('  -> ' + cargoIds.length + ' cargos activos disponibles');

    if (cargoIds.length === 0) {
        console.error('  ERROR: No hay cargos activos. Ejecute primero seed_sunat_cargos.js');
        process.exit(1);
    }

    // --- EMPLEADOS ---
    console.log('\n[1/3] Generando ' + CANTIDAD + ' empleados...');
    var empleadosInsertados = 0;
    var estadoCivil = ['SOLTERO', 'CASADO', 'DIVORCIADO', 'VIUDO', 'CONVIVIENTE'];

    for (var i = 0; i < CANTIDAD; i++) {
        var codEmp = 'EMP' + String(i + 1).padStart(4, '0');
        var p = generatePerson();
        var area = randomElem(AREAS);
        var dir = randomElem(DIRECCIONES);
        var fechaNac = new Date(randomInt(1965, 2000), randomInt(0, 11), randomInt(1, 28));
        var fechaIngreso = new Date(randomInt(2018, 2025), randomInt(0, 11), randomInt(1, 28));
        var email = p.nombre.toLowerCase().replace(/[^a-záéíóúñ]/g, '') + randomInt(10, 99) + '@empresa.com';
        var telefono = '9' + randomInt(10000000, 99999999);
        var est = Math.random() < 0.85 ? 1 : 0;
        var cargoId = cargoIds[Math.floor(Math.random() * cargoIds.length)];

        try {
            await db.query(
                'INSERT INTO empleados (id_empresa, cod_empleado, nombre, tipo_documento, num_documento, email, telefono, id_cargo, area, direccion, fecha_nacimiento, estado_civil, fecha_ingreso, estado) VALUES ' +
                '(@id_empresa, @cod_empleado, @nombre, @tipo_documento, @num_documento, @email, @telefono, @id_cargo, @area, @direccion, @fecha_nacimiento, @estado_civil, @fecha_ingreso, @estado)',
                {
                    id_empresa: { type: db.sql.Int, value: ID_EMPRESA },
                    cod_empleado: { type: db.sql.NVarChar(20), value: codEmp },
                    nombre: { type: db.sql.NVarChar(150), value: p.nombre.toUpperCase() },
                    tipo_documento: { type: db.sql.NVarChar(50), value: p.tipoDoc },
                    num_documento: { type: db.sql.NVarChar(20), value: p.numDoc },
                    email: { type: db.sql.NVarChar(100), value: email },
                    telefono: { type: db.sql.NVarChar(20), value: telefono },
                    id_cargo: { type: db.sql.Int, value: cargoId },
                    area: { type: db.sql.NVarChar(100), value: area },
                    direccion: { type: db.sql.NVarChar(200), value: dir },
                    fecha_nacimiento: { type: db.sql.Date, value: toDateStr(fechaNac) },
                    estado_civil: { type: db.sql.NVarChar(20), value: randomElem(estadoCivil) },
                    fecha_ingreso: { type: db.sql.Date, value: toDateStr(fechaIngreso) },
                    estado: { type: db.sql.Bit, value: est }
                }
            );
            empleadosInsertados++;
        } catch (e) {
            console.log('  Error empleado ' + codEmp + ': ' + e.message.substring(0, 80));
        }
    }
    console.log('  -> ' + empleadosInsertados + ' empleados insertados');

    // --- VENDEDORES ---
    console.log('\n[2/3] Generando ' + CANTIDAD + ' vendedores...');
    var vendedoresInsertados = 0;

    for (var i = 0; i < CANTIDAD; i++) {
        var codVen = 'VEN' + String(i + 1).padStart(4, '0');
        var p = generatePerson();
        var email = p.nombre.toLowerCase().replace(/[^a-záéíóúñ]/g, '') + randomInt(10, 99) + '@ventas.com';
        var telefono = '9' + randomInt(10000000, 99999999);
        var comision = randomInt(1, 15);
        var est = Math.random() < 0.85 ? 1 : 0;

        try {
            await db.query(
                'INSERT INTO vendedores (id_empresa, cod_vendedor, nombre, tipo_documento, num_documento, email, telefono, comision_porcentaje, estado) VALUES ' +
                '(@id_empresa, @cod_vendedor, @nombre, @tipo_documento, @num_documento, @email, @telefono, @comision_porcentaje, @estado)',
                {
                    id_empresa: { type: db.sql.Int, value: ID_EMPRESA },
                    cod_vendedor: { type: db.sql.NVarChar(20), value: codVen },
                    nombre: { type: db.sql.NVarChar(150), value: p.nombre.toUpperCase() },
                    tipo_documento: { type: db.sql.NVarChar(50), value: p.tipoDoc },
                    num_documento: { type: db.sql.NVarChar(20), value: p.numDoc },
                    email: { type: db.sql.NVarChar(100), value: email },
                    telefono: { type: db.sql.NVarChar(20), value: telefono },
                    comision_porcentaje: { type: db.sql.Decimal(5, 2), value: comision },
                    estado: { type: db.sql.Bit, value: est }
                }
            );
            vendedoresInsertados++;
        } catch (e) {
            console.log('  Error vendedor ' + codVen + ': ' + e.message.substring(0, 80));
        }
    }
    console.log('  -> ' + vendedoresInsertados + ' vendedores insertados');

    // --- CHOFERES ---
    console.log('\n[3/3] Generando ' + CANTIDAD + ' choferes...');
    var choferesInsertados = 0;
    var catLicencia = ['A1', 'A2', 'A3', 'B', 'C'];

    for (var i = 0; i < CANTIDAD; i++) {
        var codChof = 'CHF' + String(i + 1).padStart(4, '0');
        var p = generatePerson();
        var email = p.nombre.toLowerCase().replace(/[^a-záéíóúñ]/g, '') + randomInt(10, 99) + '@transporte.com';
        var telefono = '9' + randomInt(10000000, 99999999);
        var licencia = randomElem(LICENCIAS) + randomInt(1, 9);
        var cat = randomElem(catLicencia);
        var dir = randomElem(DIRECCIONES);
        var fechaNac = new Date(randomInt(1970, 1998), randomInt(0, 11), randomInt(1, 28));
        var fechaVencLic = new Date(randomInt(2026, 2030), randomInt(0, 11), randomInt(1, 28));
        var est = Math.random() < 0.8 ? 1 : 0;
        var tipoDoc = '1';
        var numDoc = randomDoc('1');

        try {
            await db.query(
                'INSERT INTO choferes (id_empresa, cod_chofer, nombre, tipo_documento, num_documento, email, telefono, licencia_conducir, categoria_licencia, direccion, fecha_nacimiento, fecha_vencimiento_licencia, estado) VALUES ' +
                '(@id_empresa, @cod_chofer, @nombre, @tipo_documento, @num_documento, @email, @telefono, @licencia_conducir, @categoria_licencia, @direccion, @fecha_nacimiento, @fecha_vencimiento_licencia, @estado)',
                {
                    id_empresa: { type: db.sql.Int, value: ID_EMPRESA },
                    cod_chofer: { type: db.sql.NVarChar(20), value: codChof },
                    nombre: { type: db.sql.NVarChar(150), value: p.nombre.toUpperCase() },
                    tipo_documento: { type: db.sql.NVarChar(50), value: tipoDoc },
                    num_documento: { type: db.sql.NVarChar(20), value: numDoc },
                    email: { type: db.sql.NVarChar(100), value: email },
                    telefono: { type: db.sql.NVarChar(20), value: telefono },
                    licencia_conducir: { type: db.sql.NVarChar(30), value: licencia },
                    categoria_licencia: { type: db.sql.NVarChar(10), value: cat },
                    direccion: { type: db.sql.NVarChar(200), value: dir },
                    fecha_nacimiento: { type: db.sql.Date, value: toDateStr(fechaNac) },
                    fecha_vencimiento_licencia: { type: db.sql.Date, value: toDateStr(fechaVencLic) },
                    estado: { type: db.sql.Bit, value: est }
                }
            );
            choferesInsertados++;
        } catch (e) {
            console.log('  Error chofer ' + codChof + ': ' + e.message.substring(0, 80));
        }
    }
    console.log('  -> ' + choferesInsertados + ' choferes insertados');

    console.log('\n========================================');
    console.log('  RESUMEN:');
    console.log('  Empleados:  ' + empleadosInsertados);
    console.log('  Vendedores: ' + vendedoresInsertados);
    console.log('  Choferes:   ' + choferesInsertados);
    console.log('========================================');
}

main().catch(function(err) {
    console.error('ERROR:', err.message || err);
    process.exit(1);
});
