import { PrismaService } from 'src/prisma/prisma.service';

/**
 * Resuelve, en UNA consulta, cuáles de los privilegios pedidos tiene el usuario.
 *
 * Replica la "Capa 2" de `PermissionGuard` (perfiles_privilegios ← usuario_perfiles),
 * incluido el bypass de superadmin. Es necesario porque el guard solo sabe decidir
 * a nivel de ruta, y acá el permiso depende de QUÉ COLUMNA trae cada fila: un
 * usuario puede tener permiso para editar la categoría pero no el costo.
 *
 * Las capas 1 (módulo en la suscripción) y 1.2 (addon) las sigue cubriendo el guard
 * de la ruta, que ya corrió antes de llegar acá.
 */
export async function resolverPermisos(
  prisma: PrismaService,
  user_id: string,
  privilegios: string[],
): Promise<Set<string>> {
  if (privilegios.length === 0) return new Set();

  const usuario = await prisma.usuario.findUnique({
    where: { id: user_id },
    select: { is_superadmin: true },
  });

  // Mismo bypass que el guard: el superadmin tiene todos los privilegios de los
  // módulos que su plan habilita, y el módulo ya lo validó el guard de la ruta.
  if (usuario?.is_superadmin) return new Set(privilegios);

  const otorgados = await prisma.perfiles_privilegios.findMany({
    where: {
      active: true,
      modulos: { codigo: 'INVENTARIO' },
      privilegios: { codigo: { in: privilegios } },
      perfiles: { usuario_perfiles: { some: { user_id } } },
    },
    select: { privilegios: { select: { codigo: true } } },
  });

  return new Set(otorgados.map((p) => p.privilegios.codigo));
}
