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

import {
  classesDoDispositivo,
  estaNoAr,
  fundoEmCss,
  lerAgendamento,
  lerFundo,
  momentoDoAgendamento,
  secoesNoAr,
  temCaixaPropria,
  textoDoAgendamento,
} from "./exibicao-da-secao.ts";
import { instanteDeBrasilia } from "./widgets-da-home.ts";

const em = (texto: string) => instanteDeBrasilia(texto)!;

test("seção sem agendamento está sempre no ar e a lista sai igual (mesmo objeto)", () => {
  const secoes = [{ id: "a", config: { mode: "faq" } }, { id: "b", config: null }];
  assert.equal(secoesNoAr(secoes, Date.now()), secoes);
  assert.equal(estaNoAr({ mode: "faq" }, Date.now()), true);
  assert.equal(lerAgendamento({ agendamento: { inicio: "lixo" } }), null);
});

test("a janela vale na hora de Brasília: entra no início e sai no fim", () => {
  const config = { agendamento: { inicio: "2026-10-20T08:00", fim: "2026-10-25T23:59" } };
  assert.equal(estaNoAr(config, em("2026-10-20T07:59")), false);
  assert.equal(estaNoAr(config, em("2026-10-20T08:00")), true);
  assert.equal(estaNoAr(config, em("2026-10-25T23:58")), true);
  assert.equal(estaNoAr(config, em("2026-10-25T23:59")), false);
  /* 08:00 em Brasília é 11:00 em UTC. */
  assert.equal(new Date(em("2026-10-20T08:00")).toISOString(), "2026-10-20T11:00:00.000Z");
});

test("só início ou só fim", () => {
  assert.equal(estaNoAr({ agendamento: { inicio: "2026-10-20T08:00" } }, em("2027-01-01T00:00")), true);
  assert.equal(estaNoAr({ agendamento: { fim: "2026-10-20T08:00" } }, em("2027-01-01T00:00")), false);
  assert.equal(textoDoAgendamento(lerAgendamento({ agendamento: { inicio: "2026-10-20T08:00" } })), "Agendada: aparece a partir de 20/10 às 08:00");
  assert.equal(textoDoAgendamento(lerAgendamento({ agendamento: { fim: "2026-10-25T23:59" } })), "Agendada: aparece até 25/10 às 23:59");
  assert.equal(
    textoDoAgendamento(lerAgendamento({ agendamento: { inicio: "2026-10-20T08:00", fim: "2026-10-25T23:59" } })),
    "Agendada: aparece de 20/10 às 08:00 até 25/10 às 23:59"
  );
});

test("secoesNoAr tira só as agendadas fora da janela (e lê config em texto)", () => {
  const agora = em("2026-10-22T12:00");
  const lista = [
    { id: "sempre", config: {} },
    { id: "futura", config: { agendamento: { inicio: "2026-11-01T00:00" } } },
    { id: "agora", config: JSON.stringify({ agendamento: { inicio: "2026-10-01T00:00", fim: "2026-10-30T00:00" } }) },
    { id: "vencida", config: { agendamento: { fim: "2026-10-21T00:00" } } },
  ];
  assert.deepEqual(secoesNoAr(lista, agora).map((s) => s.id), ["sempre", "agora"]);
  assert.equal(momentoDoAgendamento(lerAgendamento(lista[1].config as never), agora), "antes");
  assert.equal(momentoDoAgendamento(lerAgendamento(lista[3].config as never), agora), "depois");
});

test("fundo: nada pedido = sem caixa; espaço sozinho já pede caixa", () => {
  assert.equal(lerFundo({}), null);
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "nenhum" } }), null);
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "imagem", imagem: "javascript:alert(1)" } }), null);
  assert.equal(temCaixaPropria({ mode: "faq" }), false);
  assert.equal(temCaixaPropria({ fundo_da_secao: { acima: "g" } }), true);
  assert.equal(temCaixaPropria({ dispositivo: "celular" }), true);
  assert.equal(temCaixaPropria({ dispositivo: "qualquer" }), false);
});

test("fundo em CSS: cor, degradê e imagem com a camada escura", () => {
  assert.deepEqual(fundoEmCss(lerFundo({ fundo_da_secao: { tipo: "cor", cor: "#ff0000" } })!), { background: "#ff0000" });
  assert.deepEqual(fundoEmCss(lerFundo({ fundo_da_secao: { tipo: "gradiente", cor: "#111111", cor_2: "#222222", angulo: 450 } })!), {
    background: "linear-gradient(90deg, #111111 0%, #222222 100%)",
  });
  const imagem = fundoEmCss(lerFundo({ fundo_da_secao: { tipo: "imagem", imagem: "https://x.test/a.jpg", escurecer: 200 } })!);
  assert.match(String(imagem.backgroundImage), /rgba\(0,0,0,0\.80\).*url\("https:\/\/x\.test\/a\.jpg"\)/);
});

test("texto claro: automático sobre imagem escurecida e cor escura; a escolha da pessoa vale mais", () => {
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "imagem", imagem: "https://x.test/a.jpg", escurecer: 50 } })!.textoClaro, true);
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "imagem", imagem: "https://x.test/a.jpg", escurecer: 20 } })!.textoClaro, false);
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "cor", cor: "#111827" } })!.textoClaro, true);
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "cor", cor: "#f4f0ff" } })!.textoClaro, false);
  assert.equal(lerFundo({ fundo_da_secao: { tipo: "cor", cor: "#111827", texto_claro: false } })!.textoClaro, false);
  assert.equal(lerFundo({ fundo_da_secao: { acima: "g", texto_claro: true } })!.textoClaro, false);
});

test("aparelho: cada modelo troca na medida dele", () => {
  assert.equal(classesDoDispositivo("celular", "padrao"), "md:hidden");
  assert.equal(classesDoDispositivo("computador", "padrao"), "hidden md:block");
  assert.equal(classesDoDispositivo("celular", "vendor"), "lg:hidden");
  assert.equal(classesDoDispositivo("computador", "vendor"), "hidden lg:block");
  assert.equal(classesDoDispositivo("todos", "vendor"), "");
  assert.equal(classesDoDispositivo("celular", "boutique"), "lg:hidden");
  assert.equal(classesDoDispositivo("computador", "boutique"), "hidden lg:block");
});
