import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
import { SeguridadSeedOrchestrator } from './seed-orchestrator.service';

/**
 * Sincroniza la seguridad en cada arranque, sin pasos manuales:
 *   1. Re-siembra el catálogo global (módulos/submódulos/privilegios). Idempotente:
 *      registra los privilegios nuevos y actualiza los existentes, nunca borra.
 *   2. Backfillea los perfiles del sistema vivos: cualquier privilegio nuevo que
 *      caiga dentro de un selector que un perfil ya tenía (ej. '*' o 'SUBMODULO.*')
 *      queda otorgado automáticamente, sin tener que ir a Configuración → Perfiles.
 *      También crea los perfiles marcados `autoProvision` (p. ej. los operativos
 *      de ecommerce) que todavía falten en las empresas que ya usan perfiles del
 *      sistema.
 *
 * Es best-effort: si algo falla, se loguea pero NO tumba el arranque de la app.
 * Se puede desactivar con SEGURIDAD_SEED_ON_BOOT=false (útil en CI o migraciones
 * manuales controladas).
 */
@Injectable()
export class SeguridadSeedBootstrap implements OnApplicationBootstrap {
  private readonly logger = new Logger(SeguridadSeedBootstrap.name);

  constructor(private readonly orchestrator: SeguridadSeedOrchestrator) {}

  async onApplicationBootstrap(): Promise<void> {
    if (process.env.SEGURIDAD_SEED_ON_BOOT === 'false') {
      this.logger.log('Seed de seguridad en arranque desactivado (SEGURIDAD_SEED_ON_BOOT=false).');
      return;
    }

    try {
      const catalogo = await this.orchestrator.runCatalogoMaestro();
      const perfiles = await this.orchestrator.sincronizarPerfilesSistema();
      this.logger.log(
        `Seguridad sincronizada en arranque: privilegios nuevos=${catalogo.privilegios_creados}, ` +
          `perfiles creados=${perfiles.perfiles_creados}, privilegios nuevos asignados=${perfiles.privilegios_agregados} ` +
          `(empresas con perfiles de sistema=${perfiles.empresas}).`,
      );
    } catch (err) {
      this.logger.error(
        'No se pudo sincronizar la seguridad en el arranque (la app sigue levantando).',
        err instanceof Error ? err.stack : String(err),
      );
    }
  }
}
