import { NextResponse } from "next/server";
import { podeUsar } from "@/lib/banner-editor/limite-de-uso";
import { JEITOS_DE_FALAR, MAXIMO_DA_NARRACAO, VOZES } from "@/lib/banner-editor/narracao";
import { quemPodeCriarArtes } from "@/lib/banner-editor/servidor";
import { gerarVoz } from "@/lib/banner-editor/servidor-de-fala";

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

/**
 * A narração do vídeo: o texto vira voz (servidor-de-fala.ts: OpenAI, com o
 * Gemini de reserva) e volta o áudio para o editor pôr na trilha.
 * 40 narrações por pessoa por dia.
 */

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 { texto?: unknown; voz?: unknown; jeito?: unknown };
  const texto = String(corpo.texto ?? "").replace(/\s+/g, " ").trim();
  if (!texto) return erro("Escreva o que a voz vai falar.", 400);
  if (texto.length > MAXIMO_DA_NARRACAO) return erro(`A narração pode ter até ${MAXIMO_DA_NARRACAO} letras. Divida em partes.`, 400);
  const voz = VOZES.find((v) => v.chave === corpo.voz)?.chave ?? "nova";
  const jeito = JEITOS_DE_FALAR.find((j) => j.chave === corpo.jeito)?.chave ?? "anuncio";
  if (!podeUsar(`narracao:${acesso.usuario}`, 40)) return erro("Você já gerou muitas narrações hoje. Tente de novo amanhã.", 429);
  try {
    const { audio, tipo } = await gerarVoz(texto, voz, jeito);
    return new NextResponse(new Uint8Array(audio), { headers: { "Content-Type": tipo, "Cache-Control": "no-store" } });
  } catch (falha) {
    console.error("[artes] narração", falha instanceof Error ? falha.message : falha);
    return erro("A voz não saiu agora. Tente de novo em um minuto.", 502);
  }
}
