export const TIPOS_DOCUMENTO = ['FACTURA', 'NOTA_CREDITO', 'NOTA_REMISION'] as const;
export type TipoDocumento = (typeof TIPOS_DOCUMENTO)[number];

/** Privilegio del ERP necesario para ver cada tipo (src/seguridad/seeds/seguridad.seed-data.ts). */
export const PRIVILEGIO_VER: Record<TipoDocumento, string> = {
  FACTURA: 'VEN_FAC_FACTURA_VER',
  NOTA_CREDITO: 'VEN_NC_NOTA_CREDITO_VER',
  NOTA_REMISION: 'VEN_NR_NOTA_REMISION_VER',
};

export const NOMBRE_TIPO: Record<TipoDocumento, string> = {
  FACTURA: 'factura',
  NOTA_CREDITO: 'nota de crédito',
  NOTA_REMISION: 'nota de remisión',
};

export function tiposVisibles(privilegios: ReadonlySet<string>): TipoDocumento[] {
  return TIPOS_DOCUMENTO.filter((t) => privilegios.has(PRIVILEGIO_VER[t]));
}

export function esTipoDocumento(v: unknown): v is TipoDocumento {
  return typeof v === 'string' && (TIPOS_DOCUMENTO as readonly string[]).includes(v);
}

/** "factura", "FE", "nota de crédito", "NC", "remisión"… → tipo. null si no se reconoce. */
export function interpretarTipo(texto: string | null | undefined): TipoDocumento | null {
  if (!texto) return null;
  const t = texto.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().trim();
  if (esTipoDocumento(t.toUpperCase())) return t.toUpperCase() as TipoDocumento;
  if (/\b(nota\s+de\s+credito|credito|nc|ncr|ncre)\b/.test(t)) return 'NOTA_CREDITO';
  if (/\b(nota\s+de\s+remision|remision|nr|rem)\b/.test(t)) return 'NOTA_REMISION';
  if (/\b(factura|facturas|fe|fac|fco)\b/.test(t)) return 'FACTURA';
  return null;
}
