import { NextResponse } from "next/server";
import { createClient } from "@supabase/supabase-js";
import { randomUUID } from "node:crypto";
import { cookies } from "next/headers";

/**
 * A resposta do "resolveu?" e o registro da leitura.
 *
 * O centro de aprendizado abre sem login: não existe usuário para amarrar a
 * resposta. Então cada navegador ganha um identificador anônimo num cookie,
 * que serve só para uma coisa — impedir que a mesma pessoa vote dez vezes e
 * torça o percentual. Não vai nome, e-mail nem empresa junto.
 */

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

const COOKIE = "ktl_help_leitor";
const UM_ANO = 60 * 60 * 24 * 365;

function servico() {
  return createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL as string,
    process.env.SUPABASE_SERVICE_ROLE_KEY as string,
    { auth: { persistSession: false, autoRefreshToken: false } }
  );
}

async function quemLe() {
  const pote = await cookies();
  const atual = pote.get(COOKIE)?.value;
  if (atual && /^[0-9a-f-]{36}$/i.test(atual)) return { id: atual, novo: false };
  return { id: randomUUID(), novo: true };
}

export async function POST(request: Request) {
  const corpo = (await request.json().catch(() => null)) as Record<string, unknown> | null;
  const article_id = String(corpo?.article_id || "").trim();
  if (!/^[0-9a-f-]{36}$/i.test(article_id)) {
    return NextResponse.json({ error: "Artigo inválido." }, { status: 400 });
  }

  const leitor = await quemLe();
  const admin = servico();

  const registrando = String(corpo?.acao || "resposta");

  if (registrando === "leitura") {
    await admin.from("help_article_views").insert({ article_id, user_id: leitor.id });
  } else {
    const helpful = Boolean(corpo?.helpful);
    /* `upsert` na chave (artigo, pessoa): mudar de ideia sobrescreve em vez de
       somar duas respostas da mesma pessoa. */
    await admin
      .from("help_article_feedback")
      .upsert({ article_id, user_id: leitor.id, helpful }, { onConflict: "article_id,user_id" });

    /* Marcado como "não resolveu" o artigo sobe para revisão sozinho, sem
       sair do ar. Quem escreve descobre pelo painel, não por reclamação. */
    if (!helpful) {
      const { data: votos } = await admin.from("help_article_feedback").select("helpful").eq("article_id", article_id);
      const total = (votos ?? []).length;
      const sim = (votos ?? []).filter((v) => v.helpful).length;
      if (total >= 5 && sim / total < 0.7) {
        await admin.from("help_articles").update({ needs_review: true }).eq("id", article_id);
      }
    }
  }

  const resposta = NextResponse.json({ ok: true });
  if (leitor.novo) {
    resposta.cookies.set(COOKIE, leitor.id, {
      httpOnly: true,
      sameSite: "lax",
      secure: process.env.NODE_ENV === "production",
      maxAge: UM_ANO,
      path: "/",
    });
  }
  return resposta;
}
