import { PrismaService } from '../prisma/prisma.service';
import { resolverRubrosPermitidos, rubrosAConsultar } from '../common/utils/rubros.util';
import { tieneAccesoElevado } from './acceso-elevado';

/**
 * Rubros que el usuario puede ver. `null` = sin restricción.
 *
 * Es el alcance por sucursal (utils/alcance-sucursal.ts) llevado a rubros:
 * sus sucursales asignadas → los rubros de esas sucursales. Las reglas de
 * exención están en `resolverRubrosPermitidos`.
 */
export async function rubrosPermitidosUsuario(
  prisma: PrismaService,
  usuario_id?: string,
  empresa_id?: string,
): Promise<string[] | null> {
  if (!usuario_id || !empresa_id) return null;
  if (await tieneAccesoElevado(prisma, usuario_id, empresa_id)) return null;

  const asignaciones = await prisma.asignacion_sucursal_caja_usuario.findMany({
    where: { usuario_id, sucursal: { empresa_id, active: { not: false } } },
    select: { sucursal: { select: { sucursal_rubros: { select: { rubro_id: true } } } } },
  });
  return resolverRubrosPermitidos(
    asignaciones.map((a) => a.sucursal),
    false,
  );
}

/**
 * Rubros a filtrar para un listado: el que pidió la pantalla, validado contra
 * los permitidos del usuario. Es lo que hay que pasarle a
 * `whereProductoPorRubro` / `whereProveedorPorRubro`.
 *
 *   null  → no filtrar
 *   [...] → esos rubros (un usuario restringido queda recortado aunque la
 *           pantalla no mande `rubro_id`)
 *   []    → pidió uno que no tiene permitido: el listado sale vacío
 */
export async function rubrosFiltroUsuario(
  prisma: PrismaService,
  usuario_id: string | undefined,
  empresa_id: string | undefined,
  rubroPedido?: string | null,
): Promise<string[] | null> {
  return rubrosAConsultar(await rubrosPermitidosUsuario(prisma, usuario_id, empresa_id), rubroPedido);
}
