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

/*
 * Confere o pedido que a loja manda para o painel (a gravação da live). A
 * assinatura cobre o caminho e a consulta inteira, com a hora: vale 2 minutos.
 * A chave sai da chave de serviço, a mesma nos dois apps.
 */

function segredo(): Buffer | null {
  const chave = String(process.env.SUPABASE_SERVICE_ROLE_KEY || "").trim();
  return chave ? createHash("sha256").update(`ktalogu-live-interno:${chave}`).digest() : null;
}

export function pedidoInternoValido(req: Request, agora = Date.now()): boolean {
  const s = segredo();
  const recebida = req.headers.get("x-live-interno") || "";
  if (!s || !/^[a-f0-9]{64}$/.test(recebida)) return false;
  const url = new URL(req.url);
  const quando = Number(url.searchParams.get("quando"));
  if (!Number.isFinite(quando) || Math.abs(agora - quando) > 2 * 60 * 1000) return false;
  const esperada = createHmac("sha256", s).update(`${url.pathname}?${url.searchParams.toString()}`).digest("hex");
  const a = Buffer.from(esperada);
  const b = Buffer.from(recebida);
  return a.length === b.length && timingSafeEqual(a, b);
}

/* O link de quem apresenta (a loja confere em apps/public/src/lib/live/servidor/sala.ts). */
export function chaveDoApresentador(salaId: string, validadeMs = 12 * 60 * 60 * 1000, agora = Date.now()): string | null {
  const chave = String(process.env.SUPABASE_SERVICE_ROLE_KEY || "").trim();
  if (!chave) return null;
  const s = createHash("sha256").update(`ktalogu-live-apresentar:${chave}`).digest();
  const prazo = String(agora + validadeMs);
  return `${prazo}.${createHmac("sha256", s).update(`${salaId}.${prazo}`).digest("base64url")}`;
}
