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

import { destinoDoItem, itensProntos, lerCabecalho, lerMenu, lerNavegacao, lerRodape, slugDePagina } from "./navegacao-da-loja.ts";

test("sem nada salvo, ou com tudo igual ao padrão, a loja desenha como sempre", () => {
  assert.equal(lerNavegacao(null, []), null);
  assert.equal(lerNavegacao({ cabecalho: null, menu: null, rodape: null }, []), null);
  assert.equal(
    lerNavegacao(
      {
        cabecalho: { mostrar_busca: true, tamanho_da_logo: "normal", fixo: true },
        menu: { itens: [], mostrar_categorias: true },
        rodape: { colunas: [], sobre: "", mostrar_contato: true, mostrar_redes: true, mostrar_pagamento: true, mostrar_categorias: true },
      },
      []
    ),
    null
  );
  assert.equal(lerCabecalho({ mostrar_busca: true }), null);
  assert.equal(lerMenu({ itens: [] }), null);
  assert.equal(lerRodape({ sobre: "   " }), null);
});

test("o menu próprio é lido com grupo e destaque, sem grupo dentro de grupo", () => {
  const menu = lerMenu({
    mostrar_categorias: false,
    itens: [
      { id: "a", rotulo: "Sobre", tipo: "pagina", pagina_id: "p1", destaque: true },
      { id: "b", rotulo: "Ajuda", tipo: "grupo", filhos: [{ id: "c", tipo: "url", rotulo: "Trocas", url: "/aurora/pagina/trocas" }, { id: "d", tipo: "grupo" }] },
      { id: "e", tipo: "qualquer" },
    ],
  });
  assert.ok(menu);
  assert.equal(menu.mostrar_categorias, false);
  assert.equal(menu.itens.length, 2);
  assert.equal(menu.itens[0].destaque, true);
  assert.equal(menu.itens[1].filhos?.length, 1);
});

test("os destinos: página pelo id (escondida some), categoria pelo id, endereço sem javascript", () => {
  const ctx = { slug: "aurora", categorias: [{ id: "c1", slug: "canecas", name: "Canecas" }], paginas: [{ id: "p1", titulo: "Sobre nós", slug: "sobre-nos" }] };
  assert.deepEqual(destinoDoItem({ id: "1", rotulo: "", tipo: "pagina", pagina_id: "p1" }, ctx), { href: "/aurora/pagina/sobre-nos", externo: false, novaAba: false });
  assert.equal(destinoDoItem({ id: "1", rotulo: "", tipo: "pagina", pagina_id: "p2" }, ctx), null);
  assert.deepEqual(destinoDoItem({ id: "1", rotulo: "", tipo: "categoria", categoria_id: "c1" }, ctx)?.href, "/aurora/c/canecas");
  assert.equal(destinoDoItem({ id: "1", rotulo: "", tipo: "categoria", categoria_id: "sumiu" }, ctx), null);
  assert.equal(destinoDoItem({ id: "1", rotulo: "x", tipo: "url", url: "javascript:alert(1)" }, ctx), null);
  assert.equal(destinoDoItem({ id: "1", rotulo: "x", tipo: "url", url: "www.loja.com.br" }, ctx)?.href, "https://www.loja.com.br");

  const prontos = itensProntos(
    [
      { id: "1", rotulo: "", tipo: "pagina", pagina_id: "p1" },
      { id: "2", rotulo: "", tipo: "categoria", categoria_id: "c1" },
      { id: "3", rotulo: "Vazio", tipo: "grupo", filhos: [{ id: "4", rotulo: "", tipo: "pagina", pagina_id: "p2" }] },
    ],
    ctx
  );
  assert.deepEqual(
    prontos.map((p) => p.rotulo),
    ["Sobre nós", "Canecas"]
  );
});

test("o endereço da página: minúsculas, sem acento, com hífen", () => {
  assert.equal(slugDePagina("Sobre Nós & Trocas!"), "sobre-nos-trocas");
  assert.equal(slugDePagina("  --  "), "");
});
