import { createHmac, timingSafeEqual } from "node:crypto";
import { createAdminClient } from "@/lib/supabase-admin";

/*
 * O link público de uma arte do KtaloguDesign no endereço da LOJA
 * (ktalogu.com.br/<loja>/arte/<código> ou meudominio.com.br/arte/<código>).
 * O código é o mesmo do painel (apps/admin/src/lib/banner-editor/link-publico.ts:
 * o id da arte e a assinatura dele com a chave do servidor; as duas contas
 * precisam ficar iguais). Aqui só se confere o código e se a arte é desta
 * loja; quem desenha, toca e baixa é a página do painel (/arte/<código>),
 * que a loja mostra por dentro.
 */

const TAMANHO_DO_ID = 22;
const TAMANHO_DA_ASSINATURA = 16;

function assinatura(id: string) {
  const base = process.env.SUPABASE_SERVICE_ROLE_KEY || "";
  if (!base) return null;
  const chave = createHmac("sha256", base.trim()).update("ktalogu:link-publico-da-arte:v1").digest();
  return createHmac("sha256", chave).update(id.toLowerCase()).digest("base64url").slice(0, TAMANHO_DA_ASSINATURA);
}

/** O id da arte do código, ou null se o código não confere. */
export function idDoCodigoDaArte(codigo: string): string | null {
  if (typeof codigo !== "string" || codigo.length !== TAMANHO_DO_ID + TAMANHO_DA_ASSINATURA || !/^[A-Za-z0-9_-]+$/.test(codigo)) return null;
  const hex = Buffer.from(codigo.slice(0, TAMANHO_DO_ID), "base64url").toString("hex");
  if (hex.length !== 32) return null;
  const id = `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
  const certa = assinatura(id);
  if (!certa) return null;
  const veio = Buffer.from(codigo.slice(TAMANHO_DO_ID));
  const esperada = Buffer.from(certa);
  return veio.length === esperada.length && timingSafeEqual(veio, esperada) ? id : null;
}

export type ArteDaLoja = { nome: string; loja: string | null; miniatura: string | null };

/** A arte do link, se o código confere e ela é da loja deste endereço (outra loja não mostra arte de ninguém). */
export async function arteDaLoja(slug: string, codigo: string): Promise<ArteDaLoja | null> {
  const id = idDoCodigoDaArte(codigo);
  if (!id) return null;
  const admin = createAdminClient();
  const { data: arte } = await admin.from("artes_do_editor").select("id,user_id,nome,updated_at").eq("id", id).maybeSingle();
  if (!arte) return null;
  const linha = arte as { id: string; user_id: string; nome: string; updated_at: string };
  const { data: perfil } = await admin.from("profiles").select("slug,catalog_name,store_name").eq("id", linha.user_id).maybeSingle();
  const p = (perfil ?? {}) as { slug?: string | null; catalog_name?: string | null; store_name?: string | null };
  if (!p.slug || p.slug.toLowerCase() !== slug.toLowerCase()) return null;
  /* A miniatura desta versão (a galeria tira uma a cada mudança): vira a foto do link no WhatsApp. */
  const deposito = admin.storage.from("products");
  const nomeDaFoto = `${Date.parse(linha.updated_at) || 0}.webp`;
  const { data: fotos } = await deposito.list(`editor-artes/${linha.id}`, { limit: 20 });
  const miniatura = (fotos || []).some((f) => f.name === nomeDaFoto) ? deposito.getPublicUrl(`editor-artes/${linha.id}/${nomeDaFoto}`).data.publicUrl : null;
  return { nome: linha.nome, loja: p.catalog_name || p.store_name || null, miniatura };
}

/** Onde mora a página da arte (o painel): o local na máquina de quem desenvolve; o de verdade no resto. */
export function origemDoPainel(host: string | null) {
  const nome = (host || "").split(":")[0].toLowerCase();
  if (nome === "localhost" || nome === "127.0.0.1" || nome.endsWith(".localhost")) return process.env.KTALOGU_PAINEL_LOCAL || "http://localhost:3002";
  return "https://admin.ktalogu.com.br";
}
