/**
 * Totales de una oportunidad. Se calculan acá, fuera del servicio, porque el
 * asistente de cierre (M98) y el preview del wizard tienen que llegar al mismo
 * número que el kanban: si cada uno lo sumara por su cuenta, el vendedor vería
 * un total en la tarjeta y otro en la pantalla de confirmación.
 */

/** Meses que cubre un período de facturación. */
export const MESES_POR_FRECUENCIA: Record<string, number> = {
  mensual: 1,
  bimestral: 2,
  trimestral: 3,
  semestral: 6,
  anual: 12,
};

/** Horizonte por defecto del TCV cuando el ítem recurrente no fija duración. */
export const MESES_TCV_DEFAULT = 12;

export interface ItemCalculable {
  cantidad: number | string;
  precio_unitario: number | string;
  descuento_pct?: number | string | null;
  tipo_cobro: string;
  frecuencia?: string | null;
  n_meses?: number | null;
}

const num = (v: number | string | null | undefined) => Number(v ?? 0);

/** cantidad × precio − descuento. Sin IVA: los totales del pipeline son netos. */
export function subtotalItem(item: ItemCalculable): number {
  const bruto = num(item.cantidad) * num(item.precio_unitario);
  const desc = Math.min(Math.max(num(item.descuento_pct), 0), 100);
  return Number((bruto * (1 - desc / 100)).toFixed(4));
}

function mesesDelPeriodo(item: ItemCalculable): number {
  if (item.frecuencia === 'cada_n_meses') return Math.max(1, item.n_meses ?? 1);
  return MESES_POR_FRECUENCIA[item.frecuencia ?? ''] ?? 1;
}

/**
 * - `valor_unico`: lo que se factura una sola vez.
 * - `valor_mrr`: ingreso mensual equivalente. Un abono trimestral de 300.000
 *   aporta 100.000 de MRR, no 300.000: sin normalizar, el forecast mezclaría
 *   plazos distintos y daría un número que no significa nada.
 * - `valor_tcv`: único + todo lo recurrente a lo largo de su vigencia.
 */
export function calcularTotales(items: ItemCalculable[]): {
  valor_unico: number;
  valor_mrr: number;
  valor_tcv: number;
} {
  let valor_unico = 0;
  let valor_mrr = 0;
  let recurrenteTotal = 0;

  for (const item of items) {
    const sub = subtotalItem(item);
    if (item.tipo_cobro === 'recurrente') {
      const meses = mesesDelPeriodo(item);
      valor_mrr += sub / meses;
      recurrenteTotal += (sub / meses) * (item.n_meses && item.frecuencia !== 'cada_n_meses' ? item.n_meses : MESES_TCV_DEFAULT);
    } else {
      valor_unico += sub;
    }
  }

  const r = (n: number) => Number(n.toFixed(4));
  return { valor_unico: r(valor_unico), valor_mrr: r(valor_mrr), valor_tcv: r(valor_unico + recurrenteTotal) };
}
