import { createBrowserClient } from "@supabase/ssr";
import { type SupabaseClient } from "@supabase/supabase-js";

/**
 * Recusa uma chave de servico onde deveria ir a publica.
 *
 * Tudo com prefixo NEXT_PUBLIC_ e embutido no JavaScript enviado ao
 * navegador. Se a chave de servico cair aqui, ela vai junto — e ela ignora
 * todo o RLS, ou seja, qualquer visitante ganha acesso total ao banco. Ja
 * aconteceu nos quatro apps de uma vez; parar de pe e melhor que vazar
 * calado.
 */
function exigirChavePublica(chave: string) {
  const partes = chave.split(".");
  if (partes.length !== 3) return chave; // sb_publishable_... nao e JWT
  try {
    const payload = JSON.parse(
      Buffer.from(partes[1], "base64").toString("utf8")
    ) as { role?: string };
    if (payload.role === "service_role") {
      throw new Error(
        "NEXT_PUBLIC_SUPABASE_ANON_KEY esta com a chave de servico. " +
          "Ela iria para o navegador e daria acesso total ao banco. " +
          "Use a anon key do painel do Supabase."
      );
    }
  } catch (erro) {
    if (erro instanceof Error && erro.message.includes("chave de servico")) throw erro;
    /* payload ilegivel nao e motivo para derrubar o app */
  }
  return chave;
}

let cachedClient: SupabaseClient | null = null;

export function getSupabaseClient(): SupabaseClient {
  if (cachedClient) return cachedClient;

  const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
  const anon = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;

  if (!url || !anon) {
    throw new Error("Supabase env vars are missing.");
  }

  cachedClient = createBrowserClient(url, exigirChavePublica(anon));
  return cachedClient;
}
