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

import { PDFDocument } from "pdf-lib";

import { linkDoArquivoMarcado, linkMarcadoValido } from "./servidor/link-marcado.ts";
import { marcarPdf, pareceUmPdf } from "./servidor/marca-no-pdf.ts";

test("marca no PDF: o link assinado vale 2 minutos e só para o mesmo acesso", () => {
  const agora = Date.parse("2026-10-10T12:00:00.000Z");
  const link = new URL(linkDoArquivoMarcado("acesso-1", agora), "https://loja.test");
  const ate = Number(link.searchParams.get("ate"));
  const k = String(link.searchParams.get("k"));
  assert.equal(link.pathname, "/api/digitais/baixar/acesso-1");
  assert.equal(linkMarcadoValido("acesso-1", ate, k, agora + 60_000), true);
  assert.equal(linkMarcadoValido("acesso-1", ate, k, agora + 3 * 60_000), false, "venceu");
  assert.equal(linkMarcadoValido("acesso-2", ate, k, agora), false, "outro acesso");
  assert.equal(linkMarcadoValido("acesso-1", ate, `${k}x`, agora), false, "assinatura mexida");
});

test("marca no PDF: todas as páginas ganham o rodapé e o arquivo continua abrindo", async () => {
  const original = await PDFDocument.create();
  original.addPage([595, 842]);
  original.addPage([842, 595]);
  const bytes = await original.save();
  assert.equal(pareceUmPdf(bytes), true);
  const marcado = await marcarPdf(bytes, "Licenciado para Ana Conceição · ana@exemplo.com · pedido #1042 · Escola Aurora");
  assert.ok(marcado, "marcou");
  const lido = await PDFDocument.load(marcado);
  assert.equal(lido.getPageCount(), 2);
  assert.match(String(lido.getSubject()), /Ana Conceição/);
});

test("marca no PDF: arquivo que não é um PDF inteiro nem é tentado (vai sem a marca, na hora)", async () => {
  const lixo = new TextEncoder().encode(`%PDF-1.4\n${"ABCDEFGHIJ".repeat(50_000)}`);
  assert.equal(pareceUmPdf(lixo), false);
  const inicio = Date.now();
  assert.equal(await marcarPdf(lixo, "Licenciado para alguém"), null);
  assert.ok(Date.now() - inicio < 1000);
});
