import { createHmac } from "node:crypto";

/*
  A passagem que abre a loja como editor da página inicial, dentro do painel.

  A loja confere em apps/public/src/lib/passagem-do-editor.ts: mesma conta,
  mesmo prefixo. Assinada com a chave de serviço do Supabase (que os dois apps
  já têm, como o aviso de /api/loja/revalidar, que usa outro prefixo), vale
  duas horas e leva:
  - u: o perfil dono da loja;
  - s: o slug;
  - o: a origem do painel que pediu, a única com quem o editor conversa.

  A passagem não grava nada: na loja ela só liga a visualização do rascunho.
  Quem grava é o painel, com o login de quem está nele.
*/

export const PREFIXO_DA_PASSAGEM = "editor-da-loja:v1:";
export const VALIDADE_DA_PASSAGEM_S = 2 * 60 * 60;

export function criarPassagemDoEditor(
  dados: { dono: string; slug: string; origemDoPainel: string; agoraS?: number },
  chave: string
): string {
  if (!chave) throw new Error("Sem a chave para assinar a passagem do editor.");
  const agora = dados.agoraS ?? Math.floor(Date.now() / 1000);
  const carga = Buffer.from(
    JSON.stringify({ u: dados.dono, s: dados.slug.toLowerCase(), o: dados.origemDoPainel, e: agora + VALIDADE_DA_PASSAGEM_S }),
    "utf8"
  ).toString("base64url");
  const assinatura = createHmac("sha256", chave).update(`${PREFIXO_DA_PASSAGEM}${carga}`).digest("hex");
  return `${carga}.${assinatura}`;
}

/** Endereço local da loja em desenvolvimento (porta diferente de 3001). */
export function lojaLocalValida(valor: unknown): string | null {
  const texto = String(valor ?? "").trim().replace(/\/+$/, "");
  return /^http:\/\/(localhost|127\.0\.0\.1):\d{2,5}$/.test(texto) ? texto : null;
}
