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

import { MODELOS_PRONTOS, categoriasMaisCheias, paginaDoModelo, type DadosParaOModelo } from "./modelos-da-pagina-inicial.ts";
import { problemasDaPagina } from "./pagina-inicial.ts";

const base: DadosParaOModelo = {
  tema: "default",
  carrosselDoTopoLigado: false,
  categorias: [
    { id: "c1", name: "Cartões", slug: "cartoes" },
    { id: "c2", name: "Adesivos", slug: "adesivos" },
    { id: "c3", name: "Banners", slug: "banners" },
    { id: "c1a", name: "Cartão fosco", slug: "cartao-fosco", parent_id: "c1" },
  ],
  produtos: [
    { id: "p1", name: "Cartão", category_id: "c1a", image_url: "https://x.test/p1.jpg" },
    { id: "p2", name: "Cartão 2", category_id: "c1" },
    { id: "p3", name: "Adesivo", category_id: "c2" },
    { id: "p4", name: "Adesivo 2", category_id: "c2" },
    { id: "p5", name: "Adesivo 3", category_id: "c2" },
    { id: "p6", name: "Banner", category_id: "c3" },
  ],
  banners: [{ image_url: "https://x.test/b1.jpg" }, { image_url: "https://x.test/b2.jpg", link_type: "product", product_id: "p1" }],
  cupom: null,
  corte: { ligado: false, hora: null },
  temEndereco: false,
  temWhatsapp: false,
  temCombos: false,
};

const modos = (lista: ReturnType<typeof paginaDoModelo>) => lista.map((s) => s.config.mode);

test("as categorias mais cheias contam as subcategorias na principal e pedem 2 produtos", () => {
  assert.deepEqual(categoriasMaisCheias(base, 5).map((c) => c.id), ["c2", "c1"]);
});

test("todo modelo nasce publicável (sem problema) e com a grade fixa no fim no Padrão", () => {
  for (const modelo of MODELOS_PRONTOS) {
    const pagina = paginaDoModelo(modelo.chave, base);
    assert.deepEqual(problemasDaPagina(pagina), [], modelo.chave);
    assert.equal(pagina[pagina.length - 1].config.mode, "all_products");
    assert.ok(pagina.every((s) => s.ativa && s.id === null && s.chave.startsWith("nova:")));
  }
});

test("nada inventado: sem cupom, corte, endereço ou WhatsApp, nada disso entra", () => {
  const pagina = paginaDoModelo("grafica_rapida", base);
  assert.ok(!modos(pagina).includes("coupon_highlight"));
  assert.ok(!modos(pagina).includes("order_cutoff"));
  assert.ok(!modos(pagina).includes("store_location"));
  const faixa = pagina.find((s) => s.config.mode === "marquee")!;
  assert.deepEqual(faixa.config.itens, ["Acompanhe o seu pedido pelo link"]);
  assert.ok(!JSON.stringify(pagina).toLowerCase().includes("frete grátis"));
});

test("com os dados da loja, os blocos dela aparecem", () => {
  const pagina = paginaDoModelo("grafica_rapida", {
    ...base,
    cupom: { id: "cup", code: "BEMVINDO" },
    corte: { ligado: true, hora: "16:00:00" },
    temEndereco: true,
    temWhatsapp: true,
  });
  assert.ok(modos(pagina).includes("coupon_highlight"));
  assert.ok(modos(pagina).includes("order_cutoff"));
  assert.ok(modos(pagina).includes("store_location"));
  const faixa = pagina.find((s) => s.config.mode === "marquee")!;
  assert.ok((faixa.config.itens as string[]).includes("Pedidos até as 16h entram na produção do dia"));
  assert.ok((faixa.config.itens as string[]).includes("Use o cupom BEMVINDO na sua compra"));
});

test("banners: carrossel só quando o topo não mostra os mesmos (Vendor e carrossel do topo ligado mostram)", () => {
  assert.equal(paginaDoModelo("personalizados", base)[0].config.mode, "banner_carousel");
  assert.ok(!modos(paginaDoModelo("personalizados", { ...base, carrosselDoTopoLigado: true })).includes("banner_carousel"));
  const vendor = paginaDoModelo("brindes_corporativos", { ...base, tema: "vendor" });
  assert.ok(!modos(vendor).includes("banner_carousel"));
  assert.ok(!modos(vendor).includes("all_products"));
  /* A Boutique é da família Vendor: mesma regra. */
  const boutique = paginaDoModelo("brindes_corporativos", { ...base, tema: "boutique" });
  assert.ok(!modos(boutique).includes("banner_carousel"));
  assert.ok(!modos(boutique).includes("all_products"));
});
