import { NextResponse } from "next/server";

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

/*
 * A legenda de uma aula, em WebVTT, para quem pode assistir agora. Ela vem
 * pelo endereço da própria loja (o player só aceita legenda daqui) e o .srt
 * vira .vtt no caminho. Aula travada não entrega.
 */

const DOIS_MB = 2 * 1024 * 1024;

function vazio(status: number) {
  return new NextResponse(null, { status, headers: { "cache-control": "no-store" } });
}

export async function GET(request: Request, { params }: { params: Promise<{ id: string }> }) {
  try {
    const { id } = await params;
    const slug = String(new URL(request.url).searchParams.get("slug") || "").trim().toLowerCase();
    if (!slug) return vazio(400);

    const admin = createAdminClient();
    const acesso = await acessoAAula(admin, { slug, aulaId: id });
    if (!acesso.ok) return vazio(acesso.status);
    const legenda = acesso.aula.legenda;
    if (acesso.aula.tipo !== "video" || !legenda || legenda.status !== "pronto") return vazio(404);

    const cfg = configuracaoDoR2();
    if (!cfg) return vazio(503);
    const resposta = await fetch(enderecoParaBaixar(cfg, legenda.storage_key, { nome: legenda.nome, segundos: 300 }), { cache: "no-store" });
    if (!resposta.ok) return vazio(502);
    if (Number(resposta.headers.get("content-length") || 0) > DOIS_MB) return vazio(413);
    const bytes = new Uint8Array(await resposta.arrayBuffer());
    if (bytes.byteLength > DOIS_MB) return vazio(413);

    return new NextResponse(vttDaLegenda(textoDaLegenda(bytes)), {
      headers: {
        "content-type": "text/vtt; charset=utf-8",
        "cache-control": "private, max-age=300",
        "x-content-type-options": "nosniff",
      },
    });
  } catch (erro) {
    console.error("[digitais] legenda da aula", erro);
    return vazio(500);
  }
}
