import 'dotenv/config';
import { PrismaClient } from '@prisma/client';

/**
 * Provisiona el módulo PRESUPUESTOS para evitar lockout tras activar el PermissionGuard:
 *  1. Activa el módulo en `suscripcion_modulos` de toda suscripción Activa/EnGracia.
 *  2. Asigna los privilegios del módulo a los perfiles administrativos.
 *
 * Idempotente. Uso: `pnpm provision:presupuestos`
 * (requiere que el módulo y privilegios existan; correr antes `npx prisma db seed` si falta).
 */
const prisma = new PrismaClient();

const MODULO = 'PRESUPUESTOS';
const PRIVILEGIOS = [
  'LEER',
  'CREAR',
  'EDITAR',
  'ELIMINAR',
  'EXPORTAR',
  'IMPRIMIR',
  'PRES_APROBAR',
  'PRES_CONVERTIR',
];
// Perfiles que reciben automáticamente todos los privilegios del módulo.
const PERFILES_ADMIN = ['superAdmin', 'admin', 'Administrador', 'Gerente'];
const SUSCRIPCION_ACTIVA = ['Activo', 'EnGracia'];

// Privilegios específicos del módulo (se crean si faltan; los genéricos deben existir).
const PRIVILEGIOS_PROPIOS: Record<string, string> = {
  PRES_APROBAR: 'Aprobar presupuestos en el workflow interno',
  PRES_CONVERTIR: 'Convertir presupuestos a factura o pedido',
};

async function main() {
  // 0) Asegurar el módulo (crear si falta)
  let modulo = await prisma.modulos.findFirst({ where: { codigo: MODULO } });
  if (!modulo) {
    modulo = await prisma.modulos.create({
      data: { codigo: MODULO, descripcion: 'Presupuestos / Cotizaciones comerciales', active: true },
    });
    console.log(`🆕 Módulo "${MODULO}" creado.`);
  }

  // DEPRECATED: ahora los privilegios se crean en `src/seguridad/seeds/seguridad.seed-data.ts`
  // asociados a su submódulo (privilegios.submodulo_id es NOT NULL). Este script no los crea.
  for (const [codigo] of Object.entries(PRIVILEGIOS_PROPIOS)) {
    const ex = await prisma.privilegios.findFirst({ where: { codigo } });
    if (!ex) {
      console.warn(`⚠️  Privilegio "${codigo}" no existe — agregarlo vía seguridad.seed-data.ts.`);
    }
  }

  const privilegios = await prisma.privilegios.findMany({ where: { codigo: { in: PRIVILEGIOS } } });
  const faltantes = PRIVILEGIOS.filter((c) => !privilegios.some((p) => p.codigo === c));
  if (faltantes.length) {
    console.warn(`⚠️  Privilegios genéricos no encontrados (se omiten): ${faltantes.join(', ')}.`);
  }

  // 1) Activar el módulo en suscripciones activas
  const subs = await prisma.suscripciones.findMany({
    where: { estado: { in: SUSCRIPCION_ACTIVA } },
    select: { id: true, empresa_id: true },
  });
  let subCreadas = 0;
  let subActivadas = 0;
  for (const s of subs) {
    const existing = await prisma.suscripcion_modulos.findFirst({
      where: { suscripcion_id: s.id, modulo_id: modulo.id },
    });
    if (!existing) {
      await prisma.suscripcion_modulos.create({
        data: { suscripcion_id: s.id, modulo_id: modulo.id, activo: true, tipo: 'incluido' },
      });
      subCreadas++;
    } else if (!existing.activo) {
      await prisma.suscripcion_modulos.update({ where: { id: existing.id }, data: { activo: true } });
      subActivadas++;
    }
  }
  console.log(`📦 Suscripciones: ${subCreadas} módulo agregado, ${subActivadas} reactivado, ${subs.length} revisadas.`);

  // 2) Asignar privilegios a perfiles administrativos
  const perfiles = await prisma.perfiles.findMany({ where: { perfil: { in: PERFILES_ADMIN } } });
  let permCreados = 0;
  let permExistentes = 0;
  for (const perfil of perfiles) {
    for (const priv of privilegios) {
      const ex = await prisma.perfiles_privilegios.findFirst({
        where: { perfil_id: perfil.id, modulo_id: modulo.id, privilegio_id: priv.id },
      });
      if (!ex) {
        await prisma.perfiles_privilegios.create({
          data: { perfil_id: perfil.id, modulo_id: modulo.id, privilegio_id: priv.id, active: true },
        });
        permCreados++;
      } else {
        if (ex.active === false) {
          await prisma.perfiles_privilegios.update({ where: { id: ex.id }, data: { active: true } });
        }
        permExistentes++;
      }
    }
  }
  console.log(
    `🔑 Perfiles admin (${perfiles.length}): ${permCreados} privilegios asignados, ${permExistentes} ya existían.`,
  );
  console.log('✅ Provisión de PRESUPUESTOS completada.');
  console.log('   Nota: para otros perfiles (vendedor, supervisor…) asigná los privilegios desde Configuración › Perfiles.');
}

main()
  .catch((e) => {
    console.error('❌ Error en la provisión:', e);
    process.exit(1);
  })
  .finally(() => prisma.$disconnect());
