import LoginClient from "@/app/login/login-client";
import AprenderClient from "./painel-client";
import { createAdminClient } from "@/lib/supabase-admin";
import { createClient } from "@/lib/supabase-server";
import { isOwnerUser } from "@/lib/owner-auth";
import { baseDoHelp, CAMPOS_DA_SECAO, CAMPOS_DO_ARTIGO, CAMPOS_DA_TRILHA } from "@/lib/help";
import { calcularMetricas, medirArtigos } from "@/lib/help-metricas";

/**
 * O painel do centro de aprendizado.
 *
 * TUDO vem do servidor na primeira carga, inclusive placar e trilhas. Não é
 * capricho de desempenho: a regra da casa proíbe `setState` dentro de efeito,
 * e buscar isso no cliente ao montar seria exatamente isso. Depois de salvar,
 * a recarga acontece dentro do clique, que é evento e pode.
 */

export const dynamic = "force-dynamic";

export default async function OwnerAprenderPage() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();

  if (!user) return <LoginClient />;

  if (!isOwnerUser({ id: user.id, email: user.email })) {
    return (
      <div className="min-h-screen flex items-center justify-center p-6 bg-slate-50">
        <div className="w-full max-w-lg rounded-2xl bg-white p-8 shadow-sm border border-slate-200 text-center">
          <h1 className="text-xl font-semibold text-slate-900">Acesso negado</h1>
          <p className="text-sm text-slate-500 mt-2">Seu usuário não tem permissão para acessar este painel.</p>
        </div>
      </div>
    );
  }

  const admin = createAdminClient();
  const [secoes, artigos, trilhas, passos, medida, metricas] = await Promise.all([
    admin.from("help_sections").select(CAMPOS_DA_SECAO).order("position", { ascending: true }),
    admin
      .from("help_articles")
      .select(CAMPOS_DO_ARTIGO)
      .order("position", { ascending: true })
      .order("created_at", { ascending: false })
      .limit(500),
    admin.from("help_paths").select(CAMPOS_DA_TRILHA).order("position", { ascending: true }),
    admin.from("help_path_steps").select("path_id,article_id,position").order("position", { ascending: true }),
    medirArtigos(admin),
    calcularMetricas(admin),
  ]);

  const listaDeArtigos = (artigos.data ?? []).map((a) => ({ ...a, ...medida(String(a.id)) }));

  const contagem = new Map<string, { total: number; no_ar: number }>();
  for (const a of artigos.data ?? []) {
    const atual = contagem.get(a.section_id) ?? { total: 0, no_ar: 0 };
    atual.total += 1;
    if (a.status === "published") atual.no_ar += 1;
    contagem.set(a.section_id, atual);
  }
  const listaDeSecoes = (secoes.data ?? []).map((s) => ({
    ...s,
    artigos: contagem.get(String(s.id))?.total ?? 0,
    artigos_no_ar: contagem.get(String(s.id))?.no_ar ?? 0,
  }));

  const porTrilha = new Map<string, Array<{ article_id: string; position: number }>>();
  for (const p of passos.data ?? []) {
    const lista = porTrilha.get(p.path_id) ?? [];
    lista.push({ article_id: p.article_id, position: p.position });
    porTrilha.set(p.path_id, lista);
  }
  const listaDeTrilhas = (trilhas.data ?? []).map((t) => ({ ...t, steps: porTrilha.get(String(t.id)) ?? [] }));

  return (
    <AprenderClient
      secoesIniciais={listaDeSecoes}
      artigosIniciais={listaDeArtigos}
      trilhasIniciais={listaDeTrilhas}
      resumoInicial={metricas.resumo}
      semRespostaInicial={metricas.sem_resposta}
      base={baseDoHelp()}
    />
  );
}
