/**
 * O que cada pagamento do histórico foi: assinatura nova, renovação, upgrade,
 * troca para o mensal, renovação antecipada ou migração do plano antigo. Puro,
 * para a rota e os testes lerem a mesma regra.
 */

export type AssinaturaDoHistorico = {
  id: string;
  plano: string;
  /** A assinatura que substituiu esta (troca de plano), se houve. */
  substituidaPor: string | null;
  /** Plano antigo (webhook do LazzerPro) ou novo. */
  antiga: boolean;
};

export type PagamentoDoHistorico = { id: string; assinaturaId: string | null; status: string; data: string | null };

export type TipoDoPagamento =
  | "Assinatura"
  | "Renovação"
  | "⚡ Upgrade para o anual"
  | "Troca para o mensal"
  | "Renovação antecipada"
  | "Migração do plano antigo"
  | "Cobrança da renovação";

export function tiposDosPagamentos(pagamentos: PagamentoDoHistorico[], assinaturas: AssinaturaDoHistorico[]): Map<string, TipoDoPagamento> {
  const porId = new Map(assinaturas.map((a) => [a.id, a]));
  /* Quem esta assinatura substituiu (a que tem `substituidaPor` apontando para ela). */
  const substituiu = new Map<string, AssinaturaDoHistorico>();
  for (const a of assinaturas) if (a.substituidaPor) substituiu.set(a.substituidaPor, a);

  const tipos = new Map<string, TipoDoPagamento>();
  const jaTevePagamento = new Set<string>();
  const emOrdem = [...pagamentos].sort((x, y) => String(x.data ?? "").localeCompare(String(y.data ?? "")));

  for (const p of emOrdem) {
    const assinatura = p.assinaturaId ? porId.get(p.assinaturaId) : undefined;
    const chave = p.assinaturaId ?? p.id;
    if (p.status === "refused") {
      tipos.set(p.id, "Cobrança da renovação");
      continue;
    }
    if (jaTevePagamento.has(chave)) {
      tipos.set(p.id, "Renovação");
      continue;
    }
    jaTevePagamento.add(chave);
    const anterior = assinatura ? substituiu.get(assinatura.id) : undefined;
    if (!assinatura || !anterior) {
      tipos.set(p.id, "Assinatura");
    } else if (anterior.antiga && !assinatura.antiga) {
      tipos.set(p.id, "Migração do plano antigo");
    } else if (anterior.plano === "mensal" && assinatura.plano === "anual") {
      tipos.set(p.id, "⚡ Upgrade para o anual");
    } else if (anterior.plano === "anual" && assinatura.plano === "mensal") {
      tipos.set(p.id, "Troca para o mensal");
    } else {
      tipos.set(p.id, "Renovação antecipada");
    }
  }
  return tipos;
}
