import { NextResponse } from "next/server";
import { ArquivoRecusado, arquivoDaArte, nomeDoArquivo } from "@/lib/banner-editor/arquivo-da-arte";
import { podeUsar } from "@/lib/banner-editor/limite-de-uso";
import { arteDoLink } from "@/lib/banner-editor/link-publico";

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

/**
 * Baixar a arte pelo link público (/arte/<código>): PNG, JPG ou PDF, sem
 * login. A arte vem do banco pelo código (nunca do pedido): quem abre só
 * escolhe o formato, a página e a qualidade. Teto por endereço de rede para
 * um laço não ocupar o Chrome do servidor.
 */

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

const quemPede = (req: Request) => (req.headers.get("cf-connecting-ip") || req.headers.get("x-forwarded-for") || "").split(",")[0].trim() || "sem-endereco";

export async function POST(req: Request, { params }: { params: Promise<{ codigo: string }> }) {
  const { codigo } = await params;
  const arte = await arteDoLink(codigo);
  if (!arte) return erro("Este link não abre mais: a arte foi apagada ou o endereço veio cortado.", 404);
  if (!podeUsar(`arte-publica:baixar:${quemPede(req)}`, 60, 60 * 60 * 1000)) return erro("Muitos downloads seguidos. Espere alguns minutos e tente de novo.", 429);
  const corpo = ((await req.json().catch(() => null)) ?? {}) as Record<string, unknown>;
  const formato = corpo.formato === "jpg" || corpo.formato === "pdf" ? corpo.formato : "png";
  try {
    const { conteudo, tipo, escala } = await arquivoDaArte(arte.documento, {
      formato,
      pagina: Number(corpo.pagina) || 0,
      escala: Math.min(2, Number(corpo.escala) || 1),
      transparente: corpo.transparente === true,
      qualidade: Number(corpo.qualidade),
    });
    return new NextResponse(new Uint8Array(conteudo), {
      status: 200,
      headers: {
        "Content-Type": tipo,
        "Content-Disposition": `attachment; filename="${nomeDoArquivo(arte.nome, formato)}"`,
        "Cache-Control": "no-store",
        "X-Escala": String(escala),
      },
    });
  } catch (falha) {
    if (falha instanceof ArquivoRecusado) return erro(falha.message, falha.status);
    console.error("[artes] baixar pelo link", falha instanceof Error ? falha.message : falha);
    return erro("Não deu para gerar a arte agora. Tente de novo em instantes.", 500);
  }
}
