import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase-server";
import { createAdminClient } from "@/lib/supabase-admin";
import { isOwnerUser } from "@/lib/owner-auth";

/**
 * O placar do centro de aprendizado, e a pauta que se escreve sozinha.
 *
 * O painel não mede só leitura, mede se resolveu. E mede o que NÃO existe:
 * cada busca que voltou vazia é alguém que procurou e viu tela em branco. Essa
 * lista é o índice dos artigos que faltam, escrito pelos próprios usuários.
 */

export const dynamic = "force-dynamic";

const DIAS = 30;

export async function GET() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user || !isOwnerUser({ id: user.id, email: user.email })) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const admin = createAdminClient();
  const desde = new Date(Date.now() - DIAS * 24 * 60 * 60 * 1000).toISOString();

  const [artigos, secoes, leituras, respostas, buscas] = await Promise.all([
    admin.from("help_articles").select("id,status,needs_review,updated_at"),
    admin.from("help_sections").select("id", { count: "exact", head: true }),
    admin.from("help_article_views").select("id", { count: "exact", head: true }).gte("created_at", desde),
    admin.from("help_article_feedback").select("helpful"),
    admin.from("help_searches").select("term,normalized,created_at").eq("results_count", 0).gte("created_at", desde),
  ]);

  const lista = artigos.data ?? [];
  const no_ar = lista.filter((a) => a.status === "published").length;
  const rascunhos = lista.filter((a) => a.status === "draft").length;
  const revisar = lista.filter((a) => a.needs_review).length;

  const votos = respostas.data ?? [];
  const sim = votos.filter((v) => v.helpful).length;

  /* Agrupado pelo termo normalizado, e não pelo que foi digitado: "Nota
     Fiscal" e "nota fiscal" são a mesma dúvida, e separadas contariam 1 e 1
     em vez de 2. O texto mostrado é a primeira forma digitada, porque ela é
     mais legível que a normalizada. */
  const agrupadas = new Map<string, { termo: string; vezes: number; ultima: string }>();
  for (const b of buscas.data ?? []) {
    const atual = agrupadas.get(b.normalized);
    if (atual) {
      atual.vezes += 1;
      if (b.created_at > atual.ultima) atual.ultima = b.created_at;
    } else {
      agrupadas.set(b.normalized, { termo: b.term, vezes: 1, ultima: b.created_at });
    }
  }

  const semResposta = [...agrupadas.entries()]
    .map(([normalizado, v]) => ({ normalizado, ...v }))
    .sort((a, b) => b.vezes - a.vezes || (a.termo < b.termo ? -1 : 1))
    .slice(0, 40);

  return NextResponse.json({
    ok: true,
    dias: DIAS,
    resumo: {
      no_ar,
      rascunhos,
      revisar,
      secoes: secoes.count ?? 0,
      leituras: leituras.count ?? 0,
      respostas: votos.length,
      resolveu: votos.length > 0 ? Math.round((sim / votos.length) * 100) : null,
      buscas_sem_resposta: semResposta.reduce((soma, b) => soma + b.vezes, 0),
      termos_sem_resposta: semResposta.length,
    },
    sem_resposta: semResposta,
  });
}
