import test from "node:test";
import assert from "node:assert/strict";

import {
  FUNDO_PADRAO,
  comAgendamento,
  comDispositivo,
  comFundo,
  lerAgendamento,
  lerFundo,
  momentoDaAgenda,
  problemaDaExibicao,
  selosDaExibicao,
  textoDoAgendamento,
} from "./exibicao-da-secao.ts";
import { instanteDeBrasilia } from "./widgets-da-home.ts";

test("sem nada escolhido, nada é gravado (a seção fica como era)", () => {
  const config = { mode: "faq" };
  assert.deepEqual(comAgendamento(config, { inicio: "", fim: "" }), config);
  assert.deepEqual(comDispositivo(config, "todos"), config);
  assert.deepEqual(comFundo(config, { ...FUNDO_PADRAO }), config);
  /* Tirar o que existia apaga a chave. */
  assert.deepEqual(comDispositivo({ mode: "faq", dispositivo: "celular" }, "todos"), { mode: "faq" });
  assert.deepEqual(comAgendamento({ mode: "faq", agendamento: { inicio: "2026-10-20T08:00" } }, { inicio: "", fim: "" }), { mode: "faq" });
});

test("o fundo grava só o que o tipo usa", () => {
  assert.deepEqual(comFundo({}, { ...FUNDO_PADRAO, tipo: "cor", cor: "#ff0000", acima: "g" }).fundo_da_secao, { tipo: "cor", largura: "inteira", acima: "g", cor: "#ff0000" });
  assert.deepEqual(comFundo({}, { ...FUNDO_PADRAO, tipo: "imagem", imagem: "https://x.test/a.jpg", escurecer: 50, largura: "contida" }).fundo_da_secao, {
    tipo: "imagem",
    largura: "contida",
    imagem: "https://x.test/a.jpg",
    escurecer: 50,
  });
  assert.deepEqual(lerFundo({ fundo_da_secao: { tipo: "gradiente", cor: "#000", cor_2: "#fff", angulo: -90 } }).angulo, 270);
});

test("o que impede publicar: fim antes do início, imagem de fundo faltando", () => {
  assert.equal(problemaDaExibicao({ agendamento: { inicio: "2026-10-20T08:00", fim: "2026-10-19T08:00" } }), "o fim do agendamento precisa ser depois do início.");
  assert.equal(problemaDaExibicao({ fundo_da_secao: { tipo: "imagem" } }), "escolha a imagem do fundo (ou outro tipo de fundo).");
  assert.equal(problemaDaExibicao({ agendamento: { inicio: "2026-10-20T08:00" }, dispositivo: "celular" }), null);
});

test("textos e selos do agendamento", () => {
  const agenda = lerAgendamento({ agendamento: { inicio: "2026-10-20T08:00", fim: "2026-10-25T23:59" } });
  assert.equal(textoDoAgendamento(agenda), "Agendada: aparece de 20/10 às 08:00 até 25/10 às 23:59");
  assert.equal(momentoDaAgenda(agenda, instanteDeBrasilia("2026-10-19T00:00")!), "antes");
  assert.equal(momentoDaAgenda(agenda, instanteDeBrasilia("2026-10-21T00:00")!), "no_ar");
  assert.equal(momentoDaAgenda(agenda, instanteDeBrasilia("2026-10-26T00:00")!), "depois");
  assert.deepEqual(selosDaExibicao({ agendamento: { inicio: "2026-10-20T08:00" }, dispositivo: "computador" }, instanteDeBrasilia("2026-10-19T00:00")!), [
    "Agendada",
    "Só no computador",
  ]);
});
