/**
 * Única fuente de verdad de la coherencia entre afectación de IVA, porcentaje y
 * proporción. La consumen: `validateProductoInput` (alta/edición individual), el
 * camino de edición masiva, y el descriptor de campos del frontend.
 *
 * Es dato fiscal (va a SIFEN): si esta tabla se duplica y las copias divergen, se
 * rompe la facturación electrónica. No reimplementar en ningún otro lado.
 *
 * Códigos SIFEN: 1 = Gravado, 2 = Exonerado (por decreto), 3 = Exento (no alcanzado),
 * 4 = Gravado parcial. Los códigos 2 y 3 comparten la misma regla numérica (IVA 0%,
 * proporción 0) aunque su significado fiscal difiere.
 */

export type ResultadoCoherencia = { ok: true } | { ok: false; mensaje: string };

/** `codigo` llega como string o número según el origen del dato. */
const norm = (codigo: number | string): number => Number(codigo);

export function porcentajesValidosPara(codigo: number | string): number[] {
  const c = norm(codigo);
  if (c === 2 || c === 3) return [0];
  return [10, 5];
}

export function proporcionValidaPara(
  codigo: number | string,
): { fija: number } | { distintoDe: number } {
  const c = norm(codigo);
  if (c === 1) return { fija: 100 };
  if (c === 2 || c === 3) return { fija: 0 };
  return { distintoDe: 100 };
}

export function validarCoherenciaIva(
  codigo: number | string,
  porcentaje_iva: number,
  proporcion_iva: number,
): ResultadoCoherencia {
  const c = norm(codigo);
  const porcentajes = porcentajesValidosPara(c);

  if (!porcentajes.includes(Number(porcentaje_iva))) {
    const etiqueta =
      c === 1 ? 'Gravado' : c === 2 ? 'Exonerado' : c === 3 ? 'Exento' : 'Gravado parcial';
    return {
      ok: false,
      mensaje: `Si la afectación es ${etiqueta}, el porcentaje de IVA debe ser ${[...porcentajes]
        .sort((a, b) => a - b)
        .join(' o ')}`,
    };
  }

  const proporcion = proporcionValidaPara(c);
  if ('fija' in proporcion) {
    if (Number(proporcion_iva) !== proporcion.fija) {
      return {
        ok: false,
        mensaje: `Para esta afectación la proporción de IVA debe ser ${proporcion.fija}`,
      };
    }
  } else if (Number(proporcion_iva) === proporcion.distintoDe) {
    return {
      ok: false,
      mensaje: `Para esta afectación la proporción de IVA debe ser distinta de ${proporcion.distintoDe}`,
    };
  }

  return { ok: true };
}
