import { NextResponse } from "next/server";
import { podeUsar } from "@/lib/banner-editor/limite-de-uso";
import { doDeposito, quemPodeCriarArtes } from "@/lib/banner-editor/servidor";
import { transcrever } from "@/lib/banner-editor/servidor-de-fala";

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

/**
 * A legenda automática: o áudio (ou vídeo) do depósito vai para a
 * transcrição (servidor-de-fala.ts: OpenAI, com o Gemini de reserva) e volta
 * cada palavra com o segundo em que é falada. Só arquivos do depósito da Ktalogu, até 25 MB. 60 por pessoa por dia.
 */

const LIMITE = 25 * 1024 * 1024;

function erro(texto: string, status: number) {
  return NextResponse.json({ error: texto }, { status, headers: { "Cache-Control": "no-store" } });
}

export async function POST(request: Request) {
  const acesso = await quemPodeCriarArtes();
  if ("falha" in acesso && acesso.falha) return erro(acesso.falha.texto, acesso.falha.status);
  const corpo = (await request.json().catch(() => ({}))) as { src?: unknown };
  const src = String(corpo.src ?? "").trim();
  if (!doDeposito(src)) return erro("Esse áudio não está na Ktalogu. Envie o arquivo pelo editor primeiro.", 400);
  if (!podeUsar(`legenda:${acesso.usuario}`, 60)) return erro("Você já gerou muitas legendas hoje. Tente de novo amanhã.", 429);
  try {
    const arquivo = await fetch(src, { signal: AbortSignal.timeout(30_000) });
    if (!arquivo.ok) return erro("Não deu para abrir o áudio.", 400);
    if (Number(arquivo.headers.get("content-length") || 0) > LIMITE) return erro("O áudio passa de 25 MB. Corte um trecho menor.", 400);
    const dados = await arquivo.arrayBuffer();
    if (dados.byteLength > LIMITE) return erro("O áudio passa de 25 MB. Corte um trecho menor.", 400);
    const extensao = (src.split("?")[0].split(".").pop() || "mp3").toLowerCase().replace(/[^a-z0-9]/g, "").slice(0, 4) || "mp3";
    const { palavras, aproximado } = await transcrever(dados, arquivo.headers.get("content-type") || "audio/mpeg", `fala.${extensao}`);
    if (!palavras.length) return erro("Não achei fala nesse áudio.", 422);
    return NextResponse.json({ palavras, aproximado }, { headers: { "Cache-Control": "no-store" } });
  } catch (falha) {
    console.error("[artes] legenda", falha instanceof Error ? falha.message : falha);
    return erro("A legenda demorou demais. Tente de novo.", 504);
  }
}
