import { NextResponse } from "next/server";
import { getSupabaseClient } from "@/lib/supabase";

/**
 * Estado ao vivo da vitrine: ranking completo + totais, numa chamada so.
 *
 * A pagina consulta isso de tempos em tempos para atualizar sem recarregar.
 * A agregacao custa ~112ms e varre a tabela de eventos inteira, entao a
 * resposta fica em cache de memoria por alguns segundos: com 50 pessoas na
 * pagina o banco continua vendo poucas consultas por minuto, e ninguem ve
 * dado mais velho que esse intervalo.
 *
 * So sai numero agregado por loja — nenhum evento, sessao, cliente ou
 * pagamento individual passa por aqui.
 */
export const dynamic = "force-dynamic";

const CACHE_MS = 8000;

type Resposta = { totais: unknown; lojas: unknown[]; em: number };

let cache: { dados: Resposta; expira: number } | null = null;
/* Guarda a promessa em andamento: sem isso, dez visitantes chegando no mesmo
   instante do vencimento disparariam dez agregacoes simultaneas. */
let emVoo: Promise<Resposta> | null = null;

async function buscar(): Promise<Resposta> {
  const supabase = getSupabaseClient();
  const [ranking, totais] = await Promise.all([
    supabase.rpc("get_public_store_directory"),
    supabase.rpc("get_public_ktalogu_totals"),
  ]);

  const linhaTotais = Array.isArray(totais.data) ? totais.data[0] : null;

  return {
    lojas: Array.isArray(ranking.data) ? ranking.data : [],
    totais: linhaTotais
      ? {
          lojas: Number(linhaTotais.lojas) || 0,
          produtos: Number(linhaTotais.produtos) || 0,
          visitas: Number(linhaTotais.visitas) || 0,
          estados: Number(linhaTotais.estados) || 0,
          negociado: Number(linhaTotais.negociado) || 0,
          negociado30d: Number(linhaTotais.negociado_30d) || 0,
        }
      : null,
    em: Date.now(),
  };
}

export async function GET() {
  try {
    const agora = Date.now();
    if (cache && cache.expira > agora) {
      return NextResponse.json(
        { ok: true, ...cache.dados },
        { headers: { "cache-control": "no-store" } }
      );
    }

    if (!emVoo) {
      emVoo = buscar()
        .then((dados) => {
          cache = { dados, expira: Date.now() + CACHE_MS };
          return dados;
        })
        .finally(() => {
          emVoo = null;
        });
    }

    const dados = await emVoo;
    return NextResponse.json({ ok: true, ...dados }, { headers: { "cache-control": "no-store" } });
  } catch {
    /* Falha de rede nao pode zerar a tela: devolve o ultimo bom, se houver. */
    if (cache) {
      return NextResponse.json(
        { ok: true, ...cache.dados },
        { headers: { "cache-control": "no-store" } }
      );
    }
    return NextResponse.json({ ok: false }, { status: 200 });
  }
}
