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

/* O modulo le a chave na hora de assinar, entao ela precisa existir antes do
   import. Valor de teste; nada aqui toca no banco. */
process.env.SUPABASE_SERVICE_ROLE_KEY = "segredo-de-teste-do-link-de-compra";

const {
  createSupplierPurchaseOrderPublicToken,
  verifySupplierPurchaseOrderPublicToken,
  buildSupplierPurchaseOrderPublicUrl,
  DIAS_DE_VALIDADE_DO_LINK,
} = await import("./supplier-purchase-order-public.ts");

const COMPRA = "3f2b7c58-9a1e-4d2f-8b6a-1c0d5e7f9a20";

test("o link volta a apontar para a mesma compra", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA });
  const lido = verifySupplierPurchaseOrderPublicToken(token);
  assert.equal(lido.ok, true);
  if (!lido.ok) return;
  assert.equal(lido.pedido.purchaseOrderId, COMPRA);
  assert.equal(lido.pedido.linkVersion, 1);
});

test("o link carrega a versao, que e o que permite revogar", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA, linkVersion: 7 });
  const lido = verifySupplierPurchaseOrderPublicToken(token);
  assert.equal(lido.ok, true);
  if (!lido.ok) return;
  assert.equal(lido.pedido.linkVersion, 7);
});

test("o link nasce com a validade combinada", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA });
  const lido = verifySupplierPurchaseOrderPublicToken(token);
  assert.equal(lido.ok, true);
  if (!lido.ok) return;
  const diasQueFaltam = (lido.pedido.expiraEm.getTime() - Date.now()) / (24 * 60 * 60 * 1000);
  assert.ok(diasQueFaltam > DIAS_DE_VALIDADE_DO_LINK - 1);
  assert.ok(diasQueFaltam <= DIAS_DE_VALIDADE_DO_LINK);
});

test("link vencido nao abre", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA, diasDeValidade: 1 });
  const [id, , versao, assinatura] = token.split(".");
  /* Reescrever a data sem reassinar tem que cair na assinatura, nao passar. */
  const adulterado = `${id}.${(Math.floor(Date.now() / 1000) + 999999).toString(36)}.${versao}.${assinatura}`;
  assert.deepEqual(verifySupplierPurchaseOrderPublicToken(adulterado), { ok: false, motivo: "assinatura" });
});

test("assinatura trocada nao abre", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA });
  const partes = token.split(".");
  partes[3] = "a".repeat(partes[3].length);
  assert.deepEqual(verifySupplierPurchaseOrderPublicToken(partes.join(".")), { ok: false, motivo: "assinatura" });
});

test("token de outra compra nao abre", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA });
  const partes = token.split(".");
  partes[0] = "00000000-0000-4000-8000-000000000000";
  assert.deepEqual(verifySupplierPurchaseOrderPublicToken(partes.join(".")), { ok: false, motivo: "assinatura" });
});

test("o formato antigo de duas partes deixa de abrir", () => {
  assert.deepEqual(verifySupplierPurchaseOrderPublicToken(`${COMPRA}.abcdef1234567890`), {
    ok: false,
    motivo: "formato",
  });
});

test("sufixo extra nao gera um segundo endereco valido", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA });
  assert.deepEqual(verifySupplierPurchaseOrderPublicToken(`${token}.lixo`), { ok: false, motivo: "formato" });
});

test("o endereco de impressao e o mesmo com print=1", () => {
  const token = createSupplierPurchaseOrderPublicToken({ purchaseOrderId: COMPRA });
  assert.equal(
    buildSupplierPurchaseOrderPublicUrl("https://admin.ktalogu.com.br/", token),
    `https://admin.ktalogu.com.br/pedido-compra/${encodeURIComponent(token)}`
  );
  assert.equal(
    buildSupplierPurchaseOrderPublicUrl("https://admin.ktalogu.com.br", token, { print: true }),
    `https://admin.ktalogu.com.br/pedido-compra/${encodeURIComponent(token)}?print=1`
  );
});
