import { NextResponse } from "next/server";

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

/* Baixar um material de aula (endereço de 15 minutos) ou abrir o link dele. */
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: "Material 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 } = await admin
      .from("digital_course_materials")
      .select("id,lesson_id,url,titulo,digital_files(storage_key,nome,mime,status)")
      .eq("id", id)
      .maybeSingle();
    const material = data as unknown as {
      id: string;
      lesson_id: string;
      url: string | null;
      titulo: string;
      digital_files: { storage_key: string; nome: string; mime: string | null; status: string } | null;
    } | null;
    if (!material) return NextResponse.json({ error: "Material não encontrado." }, { status: 404, ...semCache });

    const acesso = await acessoAAula(admin, { slug, aulaId: material.lesson_id });
    if (!acesso.ok) return NextResponse.json({ error: acesso.motivo }, { status: acesso.status, ...semCache });

    if (material.url) return NextResponse.json({ ok: true, url: material.url, link: true }, semCache);
    const arquivo = material.digital_files;
    if (!arquivo || arquivo.status !== "pronto") return NextResponse.json({ error: "O material ainda está sendo preparado." }, { status: 409, ...semCache });
    const cfg = configuracaoDoR2();
    if (!cfg) return NextResponse.json({ error: "Os downloads estão indisponíveis agora." }, { status: 503, ...semCache });
    return NextResponse.json({ ok: true, url: enderecoParaBaixar(cfg, arquivo.storage_key, { nome: arquivo.nome, segundos: 900, tipo: arquivo.mime }) }, semCache);
  } catch (erro) {
    console.error("[digitais] material", erro);
    return NextResponse.json({ error: "Não foi possível abrir agora." }, { status: 500, ...semCache });
  }
}
