import { NextResponse } from "next/server";

import { canCompany, getCompanyContext } from "@/lib/company-context";
import { assinarIdentidade, voltaValida } from "@/lib/live/identidade";
import { createAdminClient, createClient } from "@/lib/supabase-server";

export const dynamic = "force-dynamic";

/*
 * A sala da live passa por aqui antes de mostrar a entrada (um pulo rápido,
 * como o "escolha a conta" do Google): se a pessoa está logada no Ktalogu,
 * volta com a empresa dela assinada; se não, volta sem nada. Quem é da
 * empresa dona da sala (com permissão nos produtos digitais) volta como quem
 * organiza.
 */

const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;

function devolver(volta: URL, token: string | null) {
  const destino = new URL(volta.toString());
  destino.hash = `ktalogu=${token ?? "0"}`;
  return NextResponse.redirect(destino.toString(), { status: 303, headers: { "cache-control": "no-store", "referrer-policy": "no-referrer" } });
}

function voltarSemNada() {
  const html =
    '<!doctype html><html lang="pt-BR"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Voltando para a sala</title>' +
    '<body style="font-family:system-ui,sans-serif;display:grid;place-items:center;min-height:100vh;margin:0;color:#3c4043">' +
    '<p>Voltando para a sala…</p><script>history.back()</script></body></html>';
  return new NextResponse(html, { status: 200, headers: { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" } });
}

export async function GET(req: Request) {
  const url = new URL(req.url);
  const salaId = url.searchParams.get("sala") || "";
  if (!UUID.test(salaId)) return voltarSemNada();

  const admin = createAdminClient();
  const { data: sala } = await admin.from("live_salas").select("id,user_id,codigo,status").eq("id", salaId).maybeSingle();
  const daSala = sala as { id: string; user_id: string; codigo: string; status: string } | null;
  if (!daSala) return voltarSemNada();

  const { data: dominios } = await admin.from("profile_custom_domains").select("domain").eq("profile_id", daSala.user_id).eq("verified", true).limit(20);
  const volta = voltaValida(url.searchParams.get("volta"), daSala, ((dominios ?? []) as Array<{ domain: string }>).map((d) => d.domain));
  /* Endereço de volta fora da regra: não manda nada assinado; só devolve a pessoa para onde estava. */
  if (!volta) return voltarSemNada();

  const chave = String(process.env.SUPABASE_SERVICE_ROLE_KEY || "").trim();
  if (!chave) return devolver(volta, null);

  try {
    const supabase = await createClient();
    const {
      data: { user },
    } = await supabase.auth.getUser();
    if (!user) return devolver(volta, null);
    const ctx = await getCompanyContext(supabase, user);
    if (ctx.membership && ctx.membership.active === false) return devolver(volta, null);
    const empresa = ctx.ownerId ?? ctx.companyId;
    const { data: perfil } = await admin
      .from("profiles")
      .select("store_name,catalog_name,catalog_logo_url,logo_url")
      .eq("id", empresa)
      .maybeSingle();
    const p = perfil as { store_name?: string | null; catalog_name?: string | null; catalog_logo_url?: string | null; logo_url?: string | null } | null;
    const nome = (p?.catalog_name || p?.store_name || user.user_metadata?.full_name || user.email?.split("@")[0] || "").trim();
    if (nome.length < 2) return devolver(volta, null);
    const logo = [p?.logo_url, p?.catalog_logo_url].find((u) => typeof u === "string" && u.startsWith("https://")) ?? null;
    const dono = empresa === daSala.user_id && canCompany(ctx, user.id, "digital.products.write");
    return devolver(volta, assinarIdentidade({ sala: daSala.id, empresa, nome, logo, dono }, chave));
  } catch (erro) {
    console.error("[live] quem-sou", erro instanceof Error ? erro.message : erro);
    return devolver(volta, null);
  }
}
