"use client";

/*
 * Quem é você, para a entrada da sala: a sala dá um pulo rápido no painel do
 * Ktalogu (onde fica a sessão de quem é assinante) e volta com a empresa
 * assinada no endereço (#ktalogu=...). Sem sessão, volta com #ktalogu=0.
 * O pulo acontece uma vez por sala nesta aba.
 */

export type ContaDoKtalogu = { token: string; nome: string; logo: string | null; dono: boolean };

const CHAVE = (salaId: string) => `ktalogu-live-conta:${salaId}`;

function ler(salaId: string): string | null {
  try {
    return sessionStorage.getItem(CHAVE(salaId));
  } catch {
    return null;
  }
}

function guardar(salaId: string, valor: string) {
  try {
    sessionStorage.setItem(CHAVE(salaId), valor);
  } catch {
    /* sem armazenamento: só não lembra */
  }
}

export function enderecoDoPainel(): string {
  const host = window.location.hostname;
  return host === "localhost" || host === "127.0.0.1" ? "http://localhost:3002" : "https://admin.ktalogu.com.br";
}

/* O que vem dentro da assinatura (a loja confere de verdade na entrada; aqui é só para mostrar). */
function abrir(token: string): ContaDoKtalogu | null {
  try {
    const corpo = token.split(".")[0] ?? "";
    const texto = atob(corpo.replace(/-/g, "+").replace(/_/g, "/"));
    const bytes = Uint8Array.from(texto, (c) => c.charCodeAt(0));
    const dados = JSON.parse(new TextDecoder().decode(bytes)) as { n?: unknown; l?: unknown; d?: unknown; x?: unknown };
    if (typeof dados.n !== "string" || Number(dados.x) < Date.now()) return null;
    return { token, nome: dados.n, logo: typeof dados.l === "string" && dados.l.startsWith("https://") ? dados.l : null, dono: dados.d === true };
  } catch {
    return null;
  }
}

/*
 * A conta já conferida nesta aba: a conta, "sem" (não está logado), ou
 * undefined (ainda não perguntou). Lê também a volta do painel no endereço.
 */
export function contaConferida(salaId: string): ContaDoKtalogu | "sem" | undefined {
  const marca = window.location.hash.match(/(?:^#|&)ktalogu=([^&]+)/);
  if (marca) {
    guardar(salaId, marca[1]);
    /* Tira do endereço (não fica no histórico nem é copiado junto com o link). */
    window.history.replaceState(null, "", window.location.pathname + window.location.search);
  }
  const guardado = ler(salaId);
  if (!guardado || guardado === "pendente") return guardado === "pendente" ? "sem" : undefined;
  if (guardado === "0") return "sem";
  return abrir(guardado) ?? "sem";
}

/*
 * Pergunta ao painel. Antes confere se ele responde (2,5 s): se o painel
 * estiver fora do ar, a pessoa entra normalmente, sem ficar presa numa página
 * de erro. Devolve false quando não deu para perguntar.
 */
export async function perguntarAoPainel(salaId: string): Promise<boolean> {
  const painel = enderecoDoPainel();
  try {
    await fetch(`${painel}/api/live/quem-sou`, { mode: "no-cors", cache: "no-store", signal: AbortSignal.timeout(2500) });
  } catch {
    return false;
  }
  guardar(salaId, "pendente");
  const volta = window.location.origin + window.location.pathname + window.location.search;
  window.location.replace(`${painel}/api/live/quem-sou?sala=${encodeURIComponent(salaId)}&volta=${encodeURIComponent(volta)}`);
  return true;
}

/* Trocar de conta ou entrar sem ela: esquece o que foi conferido. */
export function esquecerConta(salaId: string) {
  guardar(salaId, "0");
}
