import assert from "node:assert/strict";
import { describe, it } from "node:test";

import { tiposDosPagamentos } from "./historico-da-assinatura.ts";

describe("o que cada pagamento foi", () => {
  const assinaturas = [
    { id: "mensal", plano: "mensal", substituidaPor: "anual", antiga: false },
    { id: "anual", plano: "anual", substituidaPor: null, antiga: false },
  ];
  const pagamentos = [
    { id: "p1", assinaturaId: "mensal", status: "paid", data: "2026-06-25" },
    { id: "p2", assinaturaId: "mensal", status: "refunded", data: "2026-07-25" },
    { id: "p3", assinaturaId: "mensal", status: "refused", data: "2026-08-25" },
    { id: "p4", assinaturaId: "mensal", status: "paid", data: "2026-08-26" },
    { id: "p6", assinaturaId: "anual", status: "paid", data: "2026-09-28" },
  ];

  it("assinatura, renovação, cobrança recusada e upgrade", () => {
    const tipos = tiposDosPagamentos(pagamentos, assinaturas);
    assert.equal(tipos.get("p1"), "Assinatura");
    assert.equal(tipos.get("p2"), "Renovação");
    assert.equal(tipos.get("p3"), "Cobrança da renovação");
    assert.equal(tipos.get("p4"), "Renovação");
    assert.equal(tipos.get("p6"), "⚡ Upgrade para o anual");
  });

  it("troca para o mensal, renovação antecipada e migração do plano antigo", () => {
    const tipo = (anterior: { plano: string; antiga: boolean }, nova: string) =>
      tiposDosPagamentos(
        [{ id: "x", assinaturaId: "nova", status: "paid", data: "2026-09-01" }],
        [
          { id: "velha", plano: anterior.plano, substituidaPor: "nova", antiga: anterior.antiga },
          { id: "nova", plano: nova, substituidaPor: null, antiga: false },
        ]
      ).get("x");
    assert.equal(tipo({ plano: "anual", antiga: false }, "mensal"), "Troca para o mensal");
    assert.equal(tipo({ plano: "anual", antiga: false }, "anual"), "Renovação antecipada");
    assert.equal(tipo({ plano: "mensal", antiga: true }, "anual"), "Migração do plano antigo");
  });
});
