/**
 * Cómo se contabiliza la comisión de un vendedor o cobrador.
 *
 * No hay una respuesta única y el sistema no elige por el cliente:
 *
 *  - Si el comisionista es empleado, la comisión es remuneración. No hay IVA ni
 *    comprobante: va con el sueldo y los aportes.
 *  - Si es un tercero que presta un servicio, lo que genera el IVA es SU factura.
 *    El crédito fiscal se respalda con ese comprobante, no con la liquidación
 *    interna, así que la liquidación tiene que coincidir con lo que él factura.
 *
 * Por eso cada vendedor declara su régimen (`vendedores_cobradores.regimen_comision`)
 * y la pantalla explica qué implica cada uno. Sin declarar, se asienta sin IVA:
 * es el comportamiento que el sistema tuvo siempre.
 */

export const TASA_IVA_SERVICIOS = 0.1;

export type RegimenComision = 'EMPLEADO' | 'EXTERNO_IVA_INCLUIDO' | 'EXTERNO_IVA_ADICIONAL';

export interface DesgloseComision {
  /** Gasto por la comisión, sin IVA. */
  base: number;
  /** IVA crédito. Cero salvo que el comisionista facture. */
  iva: number;
  /** Lo que se le debe y se le termina pagando (base + iva). */
  aPagar: number;
  /** Si el asiento lleva una línea de IVA crédito. */
  conIva: boolean;
}

/**
 * Parte el total liquidado según el régimen del comisionista.
 *
 * `redondear` viene del servicio para usar el mismo criterio que el resto de los
 * asientos; sin él se redondea a dos decimales.
 */
export function desglosarComision(
  total: number,
  regimen: string | null | undefined,
  redondear: (v: number) => number = (v) => Math.round((v + Number.EPSILON) * 100) / 100,
): DesgloseComision {
  const monto = Number(total ?? 0);

  if (regimen === 'EXTERNO_IVA_INCLUIDO') {
    // El porcentaje que calculó el sistema es lo que el comisionista factura en
    // total: adentro viene el IVA y hay que separarlo.
    const base = redondear(monto / (1 + TASA_IVA_SERVICIOS));
    const iva = redondear(monto - base);
    return { base, iva, aPagar: redondear(base + iva), conIva: iva > 0 };
  }

  if (regimen === 'EXTERNO_IVA_ADICIONAL') {
    // El porcentaje es el honorario neto y el IVA se suma encima: se le paga más
    // de lo que arrojó el cálculo.
    const iva = redondear(monto * TASA_IVA_SERVICIOS);
    return { base: monto, iva, aPagar: redondear(monto + iva), conIva: iva > 0 };
  }

  // 'EMPLEADO' y sin declarar: remuneración, sin IVA.
  return { base: monto, iva: 0, aPagar: monto, conIva: false };
}
