// FISCAL: utilidades para el MODULO INSTALABLE (el que se va a homologar).
//
// ⚠ GUSTITO NO USA ESTO Y NO DEBE USARLO. Gustito Xpress es el puente: toma el
// pedido, lo cobra y lo despacha, y NO calcula, muestra ni reporta impuestos.
// El calculo, la numeracion y el sellado viven DENTRO del modulo instalable,
// del lado del negocio y de su RIF. Si esto vuelve a entrar a las pantallas o
// a las RPC de Gustito, se cae esa frontera y habria que homologar la app
// entera (Providencia SNAT/2024/000121, articulos 3, 8 y 9).
//
// Queda aca porque el modulo vive en este mismo monorepo y va a necesitar
// validar RIF y desglosar montos.

const PESOS_RIF = [4, 3, 2, 7, 6, 5, 4, 3, 2];
const VALOR_LETRA: Record<string, number> = { V: 1, E: 2, J: 3, P: 4, G: 5 };

/** Deja solo letra y numeros, en mayuscula: "j-50856106-6" -> "J508561066". */
function limpiarRif(rif: string): string {
  return (rif ?? '').toUpperCase().replace(/[^0-9A-Z]/g, '');
}

/**
 * Digito verificador del RIF venezolano (modulo 11). Comprobado contra RIF
 * reales: J-50856106-6 y V-22606827-5.
 */
export function rifValido(rif: string | null | undefined): boolean {
  if (!rif) return false;
  const s = limpiarRif(rif);
  if (!/^[VEJPG][0-9]{9}$/.test(s)) return false;
  let suma = VALOR_LETRA[s[0]] * PESOS_RIF[0];
  for (let i = 0; i < 8; i++) suma += Number(s[1 + i]) * PESOS_RIF[i + 1];
  let dv = 11 - (suma % 11);
  if (dv > 9) dv = 0;
  return dv === Number(s[9]);
}

/** Formato unico para guardar y para imprimir: J-50856106-6. */
export function rifNormalizado(rif: string | null | undefined): string | null {
  if (!rif) return null;
  const s = limpiarRif(rif);
  if (s.length < 10) return null;
  return `${s[0]}-${s.slice(1, 9)}-${s[9]}`;
}

/**
 * Desglose de un monto que YA trae el impuesto adentro (asi se publica el menu
 * en Venezuela): devuelve la base imponible y el impuesto, sin perder centavos.
 */
export function desgloseConIva(totalUsd: number, alicuota: number): { base: number; iva: number } {
  const total = Math.round((totalUsd || 0) * 100) / 100;
  const base = Math.round((total / (1 + (alicuota || 0) / 100)) * 100) / 100;
  return { base, iva: Math.round((total - base) * 100) / 100 };
}

/** Alicuotas que se usan en Venezuela hoy. */
export const ALICUOTAS = [
  { valor: 16, label: '16% (general)' },
  { valor: 8, label: '8% (reducida)' },
  { valor: 0, label: 'Exento (0%)' },
];
