import { NextResponse } from "next/server";
import { createHmac, timingSafeEqual } from "node:crypto";
import { createAdminClient } from "@/lib/supabase-admin";
import { esquecerLoja } from "@/lib/loja/dados-da-loja";

/**
 * O admin avisa que a loja mudou (produto salvo, apagado, importado) e a
 * lembrança da vitrine some na hora, em vez de esperar os dois minutos.
 *
 * Quem chama prova que é o admin com uma assinatura feita com a chave de
 * serviço do Supabase, que os dois apps já têm: nenhuma variável nova no
 * servidor. O corpo traz o id do dono; o slug é lido aqui, do banco.
 */

export const dynamic = "force-dynamic";

function assinatura(userId: string) {
  const chave = process.env.SUPABASE_SERVICE_ROLE_KEY || "";
  return createHmac("sha256", chave).update(`loja:${userId}`).digest("hex");
}

export async function POST(request: Request) {
  const corpo = (await request.json().catch(() => null)) as { userId?: unknown; token?: unknown } | null;
  const userId = String(corpo?.userId || "").trim();
  const token = String(corpo?.token || "").trim();
  if (!userId || !token || !process.env.SUPABASE_SERVICE_ROLE_KEY) {
    return NextResponse.json({ error: "Pedido incompleto." }, { status: 400 });
  }

  const esperado = assinatura(userId);
  const bate =
    token.length === esperado.length && timingSafeEqual(Buffer.from(token, "utf8"), Buffer.from(esperado, "utf8"));
  if (!bate) return NextResponse.json({ error: "Assinatura inválida." }, { status: 401 });

  const admin = createAdminClient();
  const { data } = await admin.from("profiles").select("slug").eq("id", userId).maybeSingle();
  const slug = String((data as { slug?: string | null } | null)?.slug || "").trim();
  if (slug) esquecerLoja(slug);

  return NextResponse.json({ ok: true, slug: slug || null });
}
