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

import { avisosDoDia, diasAteVencer, diaEmBrasilia, faixaDaAssinatura } from "./avisos-da-assinatura.ts";

/* 10/10/2026, 12:00 em Brasília. */
const AGORA = new Date("2026-10-10T15:00:00Z");
/* Vencimentos sempre às 23:59:59 de Brasília, como a rota grava. */
const vence = (dia: string) => new Date(`${dia}T23:59:59-03:00`);

describe("dias até vencer", () => {
  it("conta dias de calendário em Brasília", () => {
    assert.equal(diasAteVencer(vence("2026-10-17"), AGORA), 7);
    assert.equal(diasAteVencer(vence("2026-10-10"), AGORA), 0);
    assert.equal(diasAteVencer(vence("2026-10-09"), AGORA), -1);
    assert.equal(diaEmBrasilia(vence("2026-10-17")), "2026-10-17");
  });
});

describe("avisos por e-mail", () => {
  const conta = { email: "a@b.com", renovaSozinha: false, ativa: true };

  it("avisa 7, 3 e 1 dia antes, e no próprio dia", () => {
    assert.deepEqual(avisosDoDia({ ...conta, venceEm: vence("2026-10-17") }, AGORA), [{ tipo: "vence-em-7", referencia: "2026-10-17" }]);
    assert.deepEqual(avisosDoDia({ ...conta, venceEm: vence("2026-10-13") }, AGORA), [{ tipo: "vence-em-3", referencia: "2026-10-13" }]);
    assert.deepEqual(avisosDoDia({ ...conta, venceEm: vence("2026-10-11") }, AGORA), [{ tipo: "vence-em-1", referencia: "2026-10-11" }]);
    assert.deepEqual(avisosDoDia({ ...conta, venceEm: vence("2026-10-10") }, AGORA), [{ tipo: "vence-em-1", referencia: "2026-10-10" }]);
  });

  it("nos outros dias, nada", () => {
    assert.deepEqual(avisosDoDia({ ...conta, venceEm: vence("2026-10-15") }, AGORA), []);
    assert.deepEqual(avisosDoDia({ ...conta, venceEm: null }, AGORA), []);
  });

  it("quem renova sozinho no cartão não recebe 'vence em'", () => {
    assert.deepEqual(avisosDoDia({ ...conta, renovaSozinha: true, venceEm: vence("2026-10-17") }, AGORA), []);
  });

  it("venceu e não renovou: um aviso de acesso encerrado", () => {
    assert.deepEqual(avisosDoDia({ ...conta, ativa: false, venceEm: vence("2026-10-09") }, AGORA), [{ tipo: "acesso-encerrado", referencia: "2026-10-09" }]);
    assert.deepEqual(avisosDoDia({ ...conta, ativa: false, venceEm: vence("2026-10-01") }, AGORA), []);
  });
});

describe("faixa do painel", () => {
  const dados = { renovaSozinha: false, ativa: true, pagamentoRecusado: false };

  it("aparece nos últimos 7 dias", () => {
    assert.equal(faixaDaAssinatura({ ...dados, venceEm: vence("2026-10-20") }, AGORA), null);
    assert.equal(faixaDaAssinatura({ ...dados, venceEm: vence("2026-10-15") }, AGORA)?.tom, "atencao");
    assert.equal(faixaDaAssinatura({ ...dados, venceEm: vence("2026-10-11") }, AGORA)?.tom, "ruim");
  });

  it("cobrança recusada aparece mesmo longe do vencimento", () => {
    assert.equal(faixaDaAssinatura({ ...dados, pagamentoRecusado: true, venceEm: vence("2026-11-20") }, AGORA)?.tom, "ruim");
  });

  it("quem renova sozinho não vê faixa de vencimento", () => {
    assert.equal(faixaDaAssinatura({ ...dados, renovaSozinha: true, venceEm: vence("2026-10-12") }, AGORA), null);
  });
});
