import test from "node:test";
import assert from "node:assert/strict";
import { createHmac } from "node:crypto";

import { criarPassagemDaPrevia, PREFIXO_DA_PREVIA, VALIDADE_DA_PREVIA_S } from "./loja/passagem-da-previa.ts";
import { criarPassagemDoEditor, PREFIXO_DA_PASSAGEM } from "./loja/passagem-do-editor.ts";

/* A prévia dos temas (Catálogo > Personalização): o painel assina, a loja
   confere (apps/public/src/lib/passagem-da-previa.test.ts prova a leitura). */

const chave = "chave-de-teste";
const agora = 1_800_000_000;

test("a passagem da prévia leva dono, slug, origem e prazo de 2 h, assinada com o prefixo próprio", () => {
  const passagem = criarPassagemDaPrevia({ dono: "u1", slug: "Aurora", origemDoPainel: "http://localhost:3002", agoraS: agora }, chave);
  const [carga, assinatura] = passagem.split(".");
  const dados = JSON.parse(Buffer.from(carga, "base64url").toString("utf8"));
  assert.deepEqual(dados, { u: "u1", s: "aurora", o: "http://localhost:3002", e: agora + VALIDADE_DA_PREVIA_S });
  assert.equal(assinatura, createHmac("sha256", chave).update(`${PREFIXO_DA_PREVIA}${carga}`).digest("hex"));
});

test("o prefixo da prévia é outro que o do editor: a mesma carga dá assinaturas diferentes", () => {
  assert.notEqual(PREFIXO_DA_PREVIA, PREFIXO_DA_PASSAGEM);
  const daPrevia = criarPassagemDaPrevia({ dono: "u1", slug: "aurora", origemDoPainel: "https://admin.ktalogu.com.br", agoraS: agora }, chave);
  const doEditor = criarPassagemDoEditor({ dono: "u1", slug: "aurora", origemDoPainel: "https://admin.ktalogu.com.br", agoraS: agora }, chave);
  assert.equal(daPrevia.split(".")[0], doEditor.split(".")[0], "mesma carga");
  assert.notEqual(daPrevia.split(".")[1], doEditor.split(".")[1], "assinaturas diferentes");
});

test("sem a chave o painel não assina a prévia", () => {
  assert.throws(() => criarPassagemDaPrevia({ dono: "u1", slug: "aurora" }, ""));
});
