import { createHmac, timingSafeEqual } from "node:crypto";

/*
 * O link (da própria loja) para o PDF marcado com o comprador: vale 2
 * minutos e é assinado pelo servidor. A marca em si fica em marca-no-pdf.ts
 * (só a rota do download carrega a biblioteca de PDF).
 */

/* Até este tamanho o arquivo é marcado; maior que isso vai como está. */
export const TETO_PARA_MARCAR = 30 * 1024 * 1024;
const VALIDADE_MS = 2 * 60 * 1000;

function segredo(): string {
  return `marca-no-pdf:${process.env.SUPABASE_SERVICE_ROLE_KEY || "sem-segredo"}`;
}

function assinatura(acessoId: string, ate: number): string {
  return createHmac("sha256", segredo()).update(`${acessoId}:${ate}`).digest("base64url");
}

/** O endereço (da própria loja) do arquivo marcado, que vale 2 minutos. */
export function linkDoArquivoMarcado(acessoId: string, agora = Date.now()): string {
  const ate = agora + VALIDADE_MS;
  return `/api/digitais/baixar/${acessoId}?ate=${ate}&k=${assinatura(acessoId, ate)}`;
}

/** O link ainda vale e foi este servidor que fez? */
export function linkMarcadoValido(acessoId: string, ate: number, k: string, agora = Date.now()): boolean {
  if (!Number.isFinite(ate) || ate < agora || ate > agora + VALIDADE_MS + 5000) return false;
  const esperado = Buffer.from(assinatura(acessoId, ate));
  const recebido = Buffer.from(String(k || ""));
  return esperado.length === recebido.length && timingSafeEqual(esperado, recebido);
}
