/**
 * CLI runner para el seed de seguridad (Fase 1).
 *
 * Uso:
 *   npx ts-node src/seguridad/seeds/seed-cli.ts catalogo
 *   npx ts-node src/seguridad/seeds/seed-cli.ts perfiles --empresa=<UUID>
 *   npx ts-node src/seguridad/seeds/seed-cli.ts all --empresa=<UUID>
 *
 * El comando `catalogo` es 100% idempotente y NO requiere empresa.
 * El comando `perfiles` requiere `--empresa=<UUID>`.
 */

import { NestFactory } from '@nestjs/core';
import { Logger } from '@nestjs/common';
import { AppModule } from '../../app.module';
import { SeguridadSeedOrchestrator } from './seed-orchestrator.service';

async function main() {
  const logger = new Logger('SeedCLI');
  const args = process.argv.slice(2);
  const cmd = args[0] ?? 'catalogo';

  const empresaArg = args.find((a) => a.startsWith('--empresa='));
  const empresaId = empresaArg ? empresaArg.split('=')[1] : undefined;

  const app = await NestFactory.createApplicationContext(AppModule, {
    logger: ['error', 'warn', 'log'],
  });

  const orch = app.get(SeguridadSeedOrchestrator);

  try {
    if (cmd === 'catalogo' || cmd === 'all') {
      logger.log('▶ Ejecutando seed de catálogo (módulos, submódulos, privilegios)...');
      const r = await orch.runCatalogoMaestro();
      logger.log(`✅ Catálogo: ${JSON.stringify(r)}`);
    }

    if (cmd === 'perfiles' || cmd === 'all') {
      if (!empresaId) {
        logger.error('Falta --empresa=<UUID> para sembrar perfiles del sistema.');
        process.exit(1);
      }
      logger.log(`▶ Sembrando perfiles del sistema para empresa=${empresaId}...`);
      const r = await orch.runPerfilesSistemaParaEmpresa(empresaId);
      logger.log(`✅ Perfiles: ${JSON.stringify(r)}`);
    }

    if (!['catalogo', 'perfiles', 'all'].includes(cmd)) {
      logger.error(`Comando desconocido: "${cmd}". Usá: catalogo | perfiles | all`);
      process.exit(1);
    }
  } catch (err: any) {
    logger.error('Falló el seed', err?.stack ?? err);
    await app.close().catch(() => {});
    process.exit(1);
  } finally {
    await app.close().catch(() => {});
  }
}

// AppModule levanta Redis/cron/Socket.IO/colas que mantienen vivo el event loop aun
// después de app.close(), colgando el proceso. Forzamos la salida una vez terminado el seed.
main()
  .then(() => process.exit(0))
  .catch(() => process.exit(1));
