import assert from "node:assert/strict";
import { test } from "node:test";
import { faxinarHtmlDoBoletim, faxinarSlug } from "./faxina-html.ts";

test("deixa passar o que um boletim precisa", () => {
  const entrada =
    "<h2>O que mudou</h2><p>Frete <strong>entra</strong> no custo.</p><ul><li>Um</li><li>Dois</li></ul>";
  assert.equal(faxinarHtmlDoBoletim(entrada), entrada);
});

test("script some inteiro, com o corpo junto", () => {
  const limpo = faxinarHtmlDoBoletim("<p>Oi</p><script>alert('roubo')</script><p>Tchau</p>");
  assert.equal(limpo, "<p>Oi</p><p>Tchau</p>");
  assert.ok(!/alert/.test(limpo));
});

test("estilo e iframe também não passam", () => {
  assert.equal(faxinarHtmlDoBoletim("<style>body{display:none}</style><p>Oi</p>"), "<p>Oi</p>");
  assert.equal(faxinarHtmlDoBoletim('<iframe src="https://mau.com"></iframe><p>Oi</p>'), "<p>Oi</p>");
});

test("atributo de evento é descartado", () => {
  const limpo = faxinarHtmlDoBoletim('<p onclick="roubar()">Texto</p>');
  assert.equal(limpo, "<p>Texto</p>");
});

test("imagem com onerror perde o onerror e mantém a foto", () => {
  const limpo = faxinarHtmlDoBoletim('<img src="https://ktalogu.com.br/a.png" onerror="roubar()" alt="Foto" />');
  assert.ok(limpo.includes('src="https://ktalogu.com.br/a.png"'));
  assert.ok(limpo.includes('alt="Foto"'));
  assert.ok(!/onerror/i.test(limpo));
});

test("link javascript: não vira link", () => {
  const limpo = faxinarHtmlDoBoletim('<p><a href="javascript:roubar()">clique</a></p>');
  assert.equal(limpo, "<p>clique</p>");
});

test("link normal sai blindado contra a janela de destino", () => {
  const limpo = faxinarHtmlDoBoletim('<p><a href="https://ktalogu.com.br" target="_blank">abrir</a></p>');
  assert.ok(limpo.includes('href="https://ktalogu.com.br"'));
  assert.ok(limpo.includes('rel="noopener noreferrer nofollow"'));
  assert.ok(limpo.includes('target="_blank"'));
});

test("mailto continua valendo", () => {
  const limpo = faxinarHtmlDoBoletim('<p><a href="mailto:oi@ktalogu.com.br">escrever</a></p>');
  assert.ok(limpo.includes('href="mailto:oi@ktalogu.com.br"'));
});

test("classe fora da lista da casa é descartada", () => {
  assert.equal(faxinarHtmlDoBoletim('<div class="hackeado">x</div>'), "<div>x</div>");
  assert.equal(
    faxinarHtmlDoBoletim('<div class="boletim-destaque">x</div>'),
    '<div class="boletim-destaque">x</div>'
  );
});

test("tag desconhecida some mas o texto dela fica", () => {
  assert.equal(faxinarHtmlDoBoletim("<marquee>Texto importante</marquee>"), "Texto importante");
});

test("tag aberta e nunca fechada é fechada no fim", () => {
  assert.equal(faxinarHtmlDoBoletim("<p>Sem fechar"), "<p>Sem fechar</p>");
});

test("fechamento sem abertura é ignorado", () => {
  assert.equal(faxinarHtmlDoBoletim("Texto</p></div>"), "Texto");
});

test("sinal de menor no texto vira entidade, e não tag", () => {
  const limpo = faxinarHtmlDoBoletim("<p>2 &lt; 3 e a &amp; b</p>");
  assert.ok(limpo.includes("&lt;"));
  assert.ok(!/<script/i.test(limpo));
});

test("comentário com tag dentro não engana a leitura", () => {
  assert.equal(faxinarHtmlDoBoletim("<p>a</p><!-- <script>x</script> --><p>b</p>"), "<p>a</p><p>b</p>");
});

test("vazio devolve vazio", () => {
  assert.equal(faxinarHtmlDoBoletim(""), "");
  assert.equal(faxinarHtmlDoBoletim(null), "");
  assert.equal(faxinarHtmlDoBoletim(42), "");
});

test("o endereço tira acento, espaço e pontuação", () => {
  assert.equal(faxinarSlug("Mudança na Cobrança!"), "mudanca-na-cobranca");
  assert.equal(faxinarSlug("  frete   na compra  "), "frete-na-compra");
  assert.equal(faxinarSlug("Boletim #1 — 2026"), "boletim-1-2026");
  assert.equal(faxinarSlug(""), "");
});

test("tabela de comparação passa inteira", () => {
  const entrada = "<table class=\"boletim-tabela\"><thead><tr><th>Plano</th><th>Antes</th></tr></thead><tbody><tr><td>Mensal</td><td>R$ 37</td></tr></tbody></table>";
  assert.equal(faxinarHtmlDoBoletim(entrada), entrada);
});

test("a barra do gráfico mantém só a largura", () => {
  const limpo = faxinarHtmlDoBoletim('<i class="boletim-barra-preenche" style="width: 62.5%"></i>');
  assert.ok(limpo.includes('style="width:62.5%"'));
  assert.ok(limpo.includes('class="boletim-barra-preenche"'));
});

test("estilo que não seja largura é jogado fora", () => {
  const limpo = faxinarHtmlDoBoletim(
    '<i class="boletim-barra-preenche" style="background:url(https://mau.com/x.png);position:fixed"></i>'
  );
  assert.ok(!/style=/.test(limpo));
  assert.ok(!/background|position/.test(limpo));
});

test("largura fora da faixa não passa", () => {
  assert.ok(!/style=/.test(faxinarHtmlDoBoletim('<i class="boletim-barra-preenche" style="width:900%"></i>')));
  assert.ok(!/style=/.test(faxinarHtmlDoBoletim('<i class="boletim-barra-preenche" style="width:-10%"></i>')));
});

test("estilo em parágrafo continua sem passar", () => {
  assert.equal(faxinarHtmlDoBoletim('<p style="width:50%">texto</p>'), "<p>texto</p>");
});

test("cartão de preço sobrevive com as classes da casa", () => {
  const entrada =
    '<div class="boletim-precos"><div class="boletim-preco"><span class="boletim-preco-nome">Mensal</span></div></div>';
  assert.equal(faxinarHtmlDoBoletim(entrada), entrada);
});

/* ---------------------------------------------- centro de aprendizado */

test("o passo a passo do help passa inteiro", () => {
  const entrada =
    '<div class="help-passos"><div class="help-passo"><div class="help-passo-corpo"><h3>Escolha o balcão</h3><p>Na barra do topo.</p></div></div></div>';
  assert.equal(faxinarHtmlDoBoletim(entrada), entrada);
});

test("o aviso do help mantém o tom escolhido", () => {
  const limpo = faxinarHtmlDoBoletim('<div class="help-aviso help-aviso-atencao"><b class="help-aviso-titulo">Atenção</b>Conte a gaveta.</div>');
  assert.ok(limpo.includes("help-aviso"));
  assert.ok(limpo.includes("help-aviso-atencao"));
});

test("a pergunta abre e fecha sem script", () => {
  const entrada = '<details class="help-faq"><summary class="help-faq-pergunta">Dá para corrigir?</summary><p>Não.</p></details>';
  assert.equal(faxinarHtmlDoBoletim(entrada), entrada);
});

test("o vídeo guarda só o id do YouTube", () => {
  const limpo = faxinarHtmlDoBoletim('<figure class="help-video" data-youtube="aX9k2Lm4Qsw"></figure>');
  assert.ok(limpo.includes('data-youtube="aX9k2Lm4Qsw"'));
});

test("id de vídeo com sujeira não passa", () => {
  const limpo = faxinarHtmlDoBoletim('<figure class="help-video" data-youtube="a\\" onload=\\"roubar()"></figure>');
  assert.ok(!/data-youtube/.test(limpo));
  assert.ok(!/onload/i.test(limpo));
});

test("vídeo próprio passa pela peneira de endereço", () => {
  const bom = faxinarHtmlDoBoletim('<figure class="help-video" data-video="https://ktalogu.com.br/v.mp4"></figure>');
  assert.ok(bom.includes('data-video="https://ktalogu.com.br/v.mp4"'));
  const mau = faxinarHtmlDoBoletim('<figure class="help-video" data-video="javascript:roubar()"></figure>');
  assert.ok(!/data-video/.test(mau));
});

test("o caminho no sistema é um bloco da casa", () => {
  const entrada = '<span class="help-caminho">PDV › Caixa › Abrir</span>';
  assert.equal(faxinarHtmlDoBoletim(entrada), entrada);
});

test("classe inventada com prefixo help também é descartada", () => {
  assert.equal(faxinarHtmlDoBoletim('<div class="help-hackeado">x</div>'), "<div>x</div>");
});
