// Premissas editáveis do simulador Brasil Urbano | Série 1
export const SIM_CONFIG = {
  dataReferencia: "outubro/2026",
  cdiAnual: 0.1365, // CDI de referência
  selicMeta: 0.1375,
  poupancaMensal: 0.005,
  trMensal: 0, // [A DEFINIR — valor vigente]
  cota: 10000,
  minCotas: 1,
  maxCotas: 50,
  taxasPorPrazo: { 12: 0.016, 24: 0.018, 36: 0.02 } as Record<number, number>,
};

export type Prazo = 12 | 24 | 36;

/** Projeção bruta mensal, sem capitalização; a taxa depende do prazo contratado. */
export function projetarRendaMensal(valor: number, prazo: Prazo): number {
  return valor * SIM_CONFIG.taxasPorPrazo[prazo];
}

/** Alíquota regressiva de IR conforme dias corridos (aprox. 30 dias/mês). */
export function aliquotaIR(meses: number): number {
  const dias = meses * 30;
  if (dias <= 180) return 0.225;
  if (dias <= 360) return 0.2;
  if (dias <= 720) return 0.175;
  return 0.15;
}

export type Ponto = { mes: number; serie1: number; cdi: number; poupanca: number };

export function simular(valor: number, prazo: Prazo, liquido: boolean): Ponto[] {
  const taxa = SIM_CONFIG.taxasPorPrazo[prazo];
  const cdiM = Math.pow(1 + SIM_CONFIG.cdiAnual, 1 / 12) - 1;
  const poupM = SIM_CONFIG.poupancaMensal + SIM_CONFIG.trMensal;
  const ir = liquido ? aliquotaIR(prazo) : 0;
  const pts: Ponto[] = [];
  for (let m = 0; m <= prazo; m++) {
    const r1 = valor * taxa * m;
    const rc = valor * (Math.pow(1 + cdiM, m) - 1);
    const rp = valor * (Math.pow(1 + poupM, m) - 1);
    pts.push({
      mes: m,
      serie1: valor + r1 * (1 - ir),
      cdi: valor + rc * (1 - ir),
      poupanca: valor + rp,
    });
  }
  return pts;
}
