/**
 * Dígito verificador de RUC paraguayo (módulo 11).
 *
 * El ERP guarda el DV pero nunca lo valida: facturación lo toma tal cual vino
 * cargado. En el cierre sí se valida, porque un DV mal tipeado hace que SIFEN
 * rechace el documento DESPUÉS de emitirlo, y ahí ya hay que anular.
 */
export function calcularDv(ruc: string, base = 11): number | null {
  const limpio = String(ruc ?? '').replace(/\D/g, '');
  if (!limpio) return null;

  let total = 0;
  let k = 2;
  for (let i = limpio.length - 1; i >= 0; i--) {
    if (k > base) k = 2;
    total += Number(limpio[i]) * k;
    k++;
  }
  const resto = total % 11;
  return resto > 1 ? 11 - resto : 0;
}

/** true si el par RUC/DV es consistente. Sin RUC devuelve false. */
export function dvValido(ruc: string | null | undefined, dv: string | number | null | undefined): boolean {
  if (!ruc) return false;
  const esperado = calcularDv(ruc);
  if (esperado === null) return false;
  return String(dv ?? '').trim() === String(esperado);
}
