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

/*
 * "Quem é você" para a sala da live: o painel tem a sessão de quem está
 * logado e assina a empresa dela (nome, logo, se é a dona da sala) por 15
 * minutos. A loja confere a assinatura em
 * apps/public/src/lib/live/servidor/identidade.ts (mesma conta, mesma chave).
 * Arquivo sem servidor: os testes rodam direto.
 */

export type DadosDaIdentidade = { sala: string; empresa: string; nome: string; logo: string | null; dono: boolean };

const VALIDADE_MS = 15 * 60 * 1000;

function segredo(chaveDeServico: string): Buffer {
  return createHash("sha256").update(`ktalogu-live-identidade:${chaveDeServico}`).digest();
}

export function assinarIdentidade(dados: DadosDaIdentidade, chaveDeServico: string, agora = Date.now()): string {
  const corpo = Buffer.from(
    JSON.stringify({
      s: dados.sala,
      e: dados.empresa,
      n: dados.nome.replace(/\s+/g, " ").trim().slice(0, 60),
      l: dados.logo && /^https:\/\//.test(dados.logo) ? dados.logo.slice(0, 1000) : null,
      d: dados.dono,
      x: agora + VALIDADE_MS,
    }),
    "utf8",
  ).toString("base64url");
  return `${corpo}.${createHmac("sha256", segredo(chaveDeServico)).update(corpo).digest("base64url")}`;
}

const HOSTS_DO_KTALOGU = new Set(["ktalogu.com.br", "www.ktalogu.com.br", "localhost", "127.0.0.1"]);

/*
 * Para onde devolver: só para a sala desta live, no endereço do Ktalogu ou
 * num domínio próprio da loja dona da sala. Qualquer outro destino é
 * recusado (a assinatura nunca vai parar em site de terceiros).
 */
export function voltaValida(volta: unknown, sala: { id: string; codigo: string }, dominiosDaLoja: string[]): URL | null {
  if (typeof volta !== "string" || volta.length > 2000) return null;
  let url: URL;
  try {
    url = new URL(volta);
  } catch {
    return null;
  }
  const local = url.hostname === "localhost" || url.hostname === "127.0.0.1";
  if (url.protocol !== "https:" && !(local && url.protocol === "http:")) return null;
  if (url.username || url.password) return null;
  const host = url.hostname.toLowerCase();
  const daLoja = dominiosDaLoja.map((d) => d.toLowerCase().replace(/^www\./, ""));
  if (!HOSTS_DO_KTALOGU.has(host) && !daLoja.includes(host.replace(/^www\./, ""))) return null;
  const caminho = url.pathname.replace(/\/+$/, "");
  const daSala = caminho === `/${sala.codigo}` || new RegExp(`^/[a-z0-9-]+/live/${sala.id}$`, "i").test(caminho);
  if (!daSala) return null;
  url.hash = "";
  return url;
}
