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

/*
 * A loja fala com o painel na mesma máquina (127.0.0.1:3002 em produção) para
 * guardar a gravação: só o painel tem a chave que escreve no depósito. O
 * pedido vai assinado com uma chave tirada da chave de serviço (a mesma nos
 * dois apps) e vale por 2 minutos.
 */

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 assinaturaInterna(texto: string): string | null {
  const s = segredo();
  return s ? createHmac("sha256", s).update(texto).digest("hex") : null;
}

export function enderecoDoPainel(): string {
  const configurado = String(process.env.KTALOGU_ADMIN_INTERNO || "").trim().replace(/\/+$/, "");
  return configurado || "http://127.0.0.1:3002";
}

/* Manda um pedido assinado para o painel. `corpo` binário (parte da gravação) ou JSON. */
export async function pedirAoPainel(
  caminho: string,
  consulta: Record<string, string>,
  corpo: ArrayBuffer | Record<string, unknown> | null,
): Promise<{ status: number; json: Record<string, unknown> | null }> {
  const quando = String(Date.now());
  const busca = new URLSearchParams({ ...consulta, quando });
  const assinatura = assinaturaInterna(`${caminho}?${busca.toString()}`);
  if (!assinatura) return { status: 503, json: { error: "sem chave" } };
  const binario = corpo instanceof ArrayBuffer;
  const resposta = await fetch(`${enderecoDoPainel()}${caminho}?${busca.toString()}`, {
    method: "POST",
    headers: {
      "x-live-interno": assinatura,
      "content-type": binario ? "application/octet-stream" : "application/json",
    },
    body: binario ? corpo : JSON.stringify(corpo ?? {}),
    cache: "no-store",
    redirect: "manual",
    signal: AbortSignal.timeout(binario ? 120000 : 30000),
  });
  const json = (await resposta.json().catch(() => null)) as Record<string, unknown> | null;
  return { status: resposta.status, json };
}
