/* Só servidor: usa a chave de serviço. Nunca importar de componente cliente. */
import { createAdminClient } from "@/lib/supabase-admin";
import type { TotaisPublicos } from "./totais";

/*
  O placar da landing, buscado no servidor — um lugar só para o HTML da home
  (carregar-totais.ts) e para o ciclo ao vivo (/api/totais-publicos).

  Por que existe (21/10/2026): o número ficava zerado de vez em quando. A
  função get_public_ktalogu_totals responde em ~0,12 s, mas o banco (plano
  pequeno, CPU que trava ao passar do limite) às vezes demora mais de 3 s, e
  3 s é o corte do papel anônimo: em 24 h, 79 de 1.529 chamadas morreram em
  3,08 s. O código lia `data` sem olhar `error`, então a falha virava ZERO
  como se fosse resposta, e a home guardava esse zero por 30 min.

  Agora: a chave de serviço (sem o corte de 3 s; só a soma sai daqui), uma
  segunda tentativa, e o último valor bom guardado na memória. Falhou de vez,
  quem chama recebe null — nunca um zero inventado.
*/

const LEMBRA_POR_MS = 8000;

type Memoria = { bom: TotaisPublicos | null; em: number; emVoo: Promise<TotaisPublicos> | null };

declare global {
  var __placarDaLanding: Memoria | undefined;
}

const memoria = () => (globalThis.__placarDaLanding ??= { bom: null, em: 0, emVoo: null });

async function consultar(): Promise<TotaisPublicos> {
  const { data, error } = await createAdminClient().rpc("get_public_ktalogu_totals");
  if (error) throw error;
  const linha = Array.isArray(data) ? data[0] : null;
  if (!linha) throw new Error("O placar veio vazio.");
  return {
    lojas: Number(linha.lojas) || 0,
    estados: Number(linha.estados) || 0,
    negociado: Number(linha.negociado) || 0,
    negociado30d: Number(linha.negociado_30d) || 0,
  };
}

async function comSegundaTentativa(): Promise<TotaisPublicos> {
  try {
    return await consultar();
  } catch {
    await new Promise((r) => setTimeout(r, 400));
    return consultar();
  }
}

/** O placar de agora; sem resposta do banco, o último bom; nunca tendo tido um, null. */
export async function placarDoServidor(): Promise<TotaisPublicos | null> {
  const m = memoria();
  if (m.bom && Date.now() - m.em < LEMBRA_POR_MS) return m.bom;
  /* Dez visitantes no mesmo instante fazem uma consulta só. */
  m.emVoo ??= comSegundaTentativa().finally(() => {
    m.emVoo = null;
  });
  try {
    const dados = await m.emVoo;
    m.bom = dados;
    m.em = Date.now();
    return dados;
  } catch (erro) {
    console.error("[landing] placar sem resposta do banco:", erro instanceof Error ? erro.message : erro);
    return m.bom;
  }
}
