import { NextResponse } from "next/server";

import { acessoAAula } from "@/lib/digitais/servidor/curso";
import { createAdminClient } from "@/lib/supabase-admin";

/* Curtir (ou descurtir) um comentário de uma aula que o aluno pode ver. */
export async function POST(request: Request, { params }: { params: Promise<{ id: string }> }) {
  const semCache = { headers: { "cache-control": "no-store" } };
  try {
    const { id } = await params;
    if (!/^[0-9a-f-]{36}$/i.test(id)) return NextResponse.json({ error: "Comentário inválido." }, { status: 400, ...semCache });
    const corpo = (await request.json().catch(() => null)) as { slug?: unknown } | null;
    const slug = typeof corpo?.slug === "string" ? corpo.slug.trim().toLowerCase() : "";
    const admin = createAdminClient();
    const { data: comentario } = await admin
      .from("digital_course_comments")
      .select("id,lesson_id,status")
      .eq("id", id)
      .is("apagado_em", null)
      .maybeSingle();
    const linha = comentario as { id: string; lesson_id: string; status: string } | null;
    if (!linha || linha.status !== "publicado") return NextResponse.json({ error: "Comentário não encontrado." }, { status: 404, ...semCache });

    const acesso = await acessoAAula(admin, { slug, aulaId: linha.lesson_id });
    if (!acesso.ok) return NextResponse.json({ error: acesso.motivo }, { status: acesso.status, ...semCache });
    if (acesso.quem.tipo !== "aluno") return NextResponse.json({ error: "Na prévia não dá para curtir." }, { status: 403, ...semCache });
    const clienteId = acesso.quem.clienteId;

    const { data: existente } = await admin
      .from("digital_course_comment_likes")
      .select("comment_id")
      .eq("comment_id", id)
      .eq("client_id", clienteId)
      .maybeSingle();
    if (existente) await admin.from("digital_course_comment_likes").delete().eq("comment_id", id).eq("client_id", clienteId);
    else await admin.from("digital_course_comment_likes").insert({ comment_id: id, client_id: clienteId });

    /* A contagem guardada no comentário é refeita da tabela (nunca soma às cegas). */
    const { count } = await admin.from("digital_course_comment_likes").select("comment_id", { count: "exact", head: true }).eq("comment_id", id);
    await admin.from("digital_course_comments").update({ curtidas: count ?? 0 }).eq("id", id);
    return NextResponse.json({ ok: true, curti: !existente, curtidas: count ?? 0 }, semCache);
  } catch (erro) {
    console.error("[digitais] curtir", erro);
    return NextResponse.json({ error: "Não foi possível agora." }, { status: 500, ...semCache });
  }
}
