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

import { criarPassagemDaPrevia, lerPassagemDaPrevia, temaDaPagina, temaDaPrevia, VALIDADE_DA_PREVIA_S } from "./passagem-da-previa.ts";
import { criarPassagemDoEditor, lerPassagemDoEditor } from "./passagem-do-editor.ts";
import { criarPassagemDaPrevia as criarNoPainel } from "../../../admin/src/lib/loja/passagem-da-previa.ts";

const chave = "chave-de-teste";
const agora = 1_800_000_000;
const loja = { dono: "u1", slug: "aurora" };

test("a passagem da prévia vale íntegra, no prazo, para a loja e o dono certos", () => {
  const passagem = criarPassagemDaPrevia({ dono: "u1", slug: "Aurora", origemDoPainel: "https://admin.ktalogu.com.br", agoraS: agora }, chave);
  const lida = lerPassagemDaPrevia(passagem, loja, chave, agora + 10);
  assert.ok(lida, "a passagem certa vale");
  assert.equal(lida?.slug, "aurora");
  assert.equal(lida?.vence, agora + VALIDADE_DA_PREVIA_S);
  /* Slug com outra caixa é a mesma loja. */
  assert.ok(lerPassagemDaPrevia(passagem, { dono: "u1", slug: "AURORA" }, chave, agora));
});

test("a assinada pelo painel é a mesma conta que a loja confere", () => {
  const passagem = criarNoPainel({ dono: "u1", slug: "aurora", origemDoPainel: "http://localhost:3002", agoraS: agora }, chave);
  assert.ok(lerPassagemDaPrevia(passagem, loja, chave, agora + 60));
  assert.throws(() => criarNoPainel({ dono: "u1", slug: "aurora" }, ""), "sem chave o painel não assina");
});

test("adulterada, de outra loja, de outro dono, vencida ou com outra chave não vale", () => {
  const passagem = criarPassagemDaPrevia({ dono: "u1", slug: "aurora", agoraS: agora }, chave);
  const [carga, assinatura] = passagem.split(".");

  /* Carga trocada (outra loja) com a assinatura antiga. */
  const cargaDeOutra = Buffer.from(JSON.stringify({ u: "u1", s: "outra", o: "", e: agora + 100 }), "utf8").toString("base64url");
  assert.equal(lerPassagemDaPrevia(`${cargaDeOutra}.${assinatura}`, { dono: "u1", slug: "outra" }, chave, agora), null, "carga adulterada");
  /* Um caractere a menos/trocado na assinatura. */
  const trocada = assinatura.slice(0, -1) + (assinatura.endsWith("0") ? "1" : "0");
  assert.equal(lerPassagemDaPrevia(`${carga}.${trocada}`, loja, chave, agora), null, "assinatura trocada");
  assert.equal(lerPassagemDaPrevia(`${carga}.${assinatura.slice(1)}`, loja, chave, agora), null, "assinatura curta");

  assert.equal(lerPassagemDaPrevia(passagem, { dono: "u1", slug: "outra" }, chave, agora), null, "outra loja");
  assert.equal(lerPassagemDaPrevia(passagem, { dono: "u2", slug: "aurora" }, chave, agora), null, "outro dono");
  assert.equal(lerPassagemDaPrevia(passagem, loja, chave, agora + VALIDADE_DA_PREVIA_S + 1), null, "vencida");
  assert.equal(lerPassagemDaPrevia(passagem, loja, "outra-chave", agora), null, "outra chave");
  assert.equal(lerPassagemDaPrevia(passagem, loja, "", agora), null, "servidor sem chave");
  assert.equal(lerPassagemDaPrevia(passagem, { dono: "", slug: "aurora" }, chave, agora), null, "loja sem dono");

  /* Prazo esticado à mão (assinado de verdade, mas para muito além de 2 h). */
  const longa = criarPassagemDaPrevia({ dono: "u1", slug: "aurora", agoraS: agora + 10 * VALIDADE_DA_PREVIA_S }, chave);
  assert.equal(lerPassagemDaPrevia(longa, loja, chave, agora), null, "prazo longo demais");

  for (const lixo of ["", "lixo", ".", "abc.", ".abc", "x".repeat(1300), null, undefined, 123]) {
    assert.equal(lerPassagemDaPrevia(lixo, loja, chave, agora), null, `lixo: ${String(lixo).slice(0, 10)}`);
  }
});

test("a passagem do editor não vale como prévia, e a da prévia não abre o editor", () => {
  const doEditor = criarPassagemDoEditor({ dono: "u1", slug: "aurora", origemDoPainel: "https://admin.ktalogu.com.br", agoraS: agora }, chave);
  assert.ok(lerPassagemDoEditor(doEditor, loja, chave, agora), "a do editor vale no editor");
  assert.equal(lerPassagemDaPrevia(doEditor, loja, chave, agora), null, "a do editor não vale na prévia");

  const daPrevia = criarPassagemDaPrevia({ dono: "u1", slug: "aurora", origemDoPainel: "https://admin.ktalogu.com.br", agoraS: agora }, chave);
  assert.equal(lerPassagemDoEditor(daPrevia, loja, chave, agora), null, "a da prévia não vale no editor");
});

test("só os quatro temas que a loja desenha entram na prévia", () => {
  assert.equal(temaDaPrevia("vendor"), "vendor");
  assert.equal(temaDaPrevia(" boutique "), "boutique");
  assert.equal(temaDaPrevia("default"), "default");
  assert.equal(temaDaPrevia("vitrine"), "vitrine");
  assert.equal(temaDaPrevia("neo"), null);
  assert.equal(temaDaPrevia("../x"), null);
  assert.equal(temaDaPrevia(undefined), null);
});

test("em produção o ?tema= só muda o desenho com a passagem da prévia conferida", () => {
  const salvo = "vitrine";
  /* Produção, sem passagem (ou com uma que não conferiu): vale o tema salvo. */
  assert.equal(temaDaPagina({ pedido: "vendor", naPrevia: false, producao: true, salvo }), "vitrine");
  assert.equal(temaDaPagina({ pedido: "boutique", naPrevia: false, producao: true, salvo }), "vitrine");
  /* Produção, passagem conferida: o tema pedido. */
  assert.equal(temaDaPagina({ pedido: "vendor", naPrevia: true, producao: true, salvo }), "vendor");
  /* Tema que não existe nunca entra, nem na prévia. */
  assert.equal(temaDaPagina({ pedido: "neo", naPrevia: true, producao: true, salvo }), "vitrine");
  assert.equal(temaDaPagina({ pedido: undefined, naPrevia: true, producao: true, salvo }), "vitrine");
  /* Fora de produção o ?tema= sempre valeu (comparar lado a lado). */
  assert.equal(temaDaPagina({ pedido: "boutique", naPrevia: false, producao: false, salvo }), "boutique");
  assert.equal(temaDaPagina({ pedido: "", naPrevia: false, producao: false, salvo: null }), null);

  /* A cadeia inteira em produção: passagem lida e então o tema. */
  const loja = { dono: "u1", slug: "aurora" };
  const decidir = (bruto: unknown) =>
    temaDaPagina({ pedido: "vendor", naPrevia: Boolean(lerPassagemDaPrevia(bruto, loja, chave, agora)), producao: true, salvo });
  assert.equal(decidir(criarPassagemDaPrevia({ dono: "u1", slug: "aurora", agoraS: agora }, chave)), "vendor", "passagem certa");
  assert.equal(decidir(undefined), "vitrine", "sem passagem");
  assert.equal(decidir(criarPassagemDaPrevia({ dono: "u1", slug: "outra", agoraS: agora }, chave)), "vitrine", "outra loja");
  assert.equal(decidir(criarPassagemDaPrevia({ dono: "u1", slug: "aurora", agoraS: agora - 3 * VALIDADE_DA_PREVIA_S }, chave)), "vitrine", "vencida");
  assert.equal(decidir(criarPassagemDaPrevia({ dono: "u1", slug: "aurora", agoraS: agora }, chave) + "0"), "vitrine", "adulterada");
  assert.equal(
    decidir(criarPassagemDoEditor({ dono: "u1", slug: "aurora", origemDoPainel: "https://admin.ktalogu.com.br", agoraS: agora }, chave)),
    "vitrine",
    "passagem do editor"
  );
});
