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

import { MODOS_DOS_WIDGETS, instanteDeBrasilia, problemaDoWidget, textoDeBrasilia, widgetNovo } from "./widgets-da-home.ts";
import { NOME_DO_MODO, paginaParaGravar, problemasDaPagina, secaoNova } from "./pagina-inicial.ts";

test("hora de Brasília ida e volta", () => {
  const instante = instanteDeBrasilia("2026-10-20T18:00");
  assert.equal(new Date(instante as number).toISOString(), "2026-10-20T21:00:00.000Z");
  assert.equal(textoDeBrasilia(instante as number), "2026-10-20T18:00");
  assert.equal(instanteDeBrasilia("20/10/2026"), null);
});

test("todo bloco novo nasce com nome, configuração e modo", () => {
  for (const modo of MODOS_DOS_WIDGETS) {
    const secao = secaoNova(modo);
    assert.equal(secao.modo, modo);
    assert.equal(secao.config.mode, modo);
    assert.ok(NOME_DO_MODO[modo]);
    assert.ok(widgetNovo(modo).title);
  }
});

test("o que impede publicar cada bloco", () => {
  assert.match(String(problemaDoWidget("flash_offer", { produtos: [] })), /data/);
  assert.match(String(problemaDoWidget("flash_offer", { termina_em: "2026-10-20T18:00", produtos: [] })), /produtos/);
  /* Oferta vencida não trava a página. */
  assert.equal(problemaDoWidget("flash_offer", { termina_em: "2020-01-01T00:00", produtos: ["x"] }), null);
  assert.match(String(problemaDoWidget("video_section", { url: "https://evil.com/x.mp4" })), /YouTube/);
  assert.equal(problemaDoWidget("video_section", { url: "https://youtu.be/dQw4w9WgXcQ" }), null);
  assert.match(String(problemaDoWidget("faq", { itens: [{ pergunta: "Oi?", resposta: "" }] })), /resposta/);
  assert.equal(problemaDoWidget("recently_viewed", {}), null);
});

test("os problemas dos blocos entram na lista da página e o bloco vai ao banco com o modo", () => {
  const secao = secaoNova("coupon_highlight");
  assert.equal(problemasDaPagina([secao]).length, 1);
  const pronta = { ...secao, config: { ...secao.config, cupom_id: "abc" } };
  assert.equal(problemasDaPagina([pronta]).length, 0);
  const [linha] = paginaParaGravar([pronta]);
  assert.equal(linha.section_type, "manual_products");
  assert.equal(linha.config.mode, "coupon_highlight");
  assert.equal(linha.produtos, undefined);
});
