import { NextResponse } from "next/server";
import { ArquivoRecusado, arquivoDaArte, nomeDoArquivo } from "@/lib/banner-editor/arquivo-da-arte";
import { documentoLimpo } from "@/lib/banner-editor/documento";
import { LIMITE_DO_LADO, MINIMO_DO_LADO } from "@/lib/banner-editor/formatos";
import { quemPodeCriarArtes } from "@/lib/banner-editor/servidor";

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

/**
 * Baixar a arte do editor (como o "Baixar" do Canva): PNG (com ou sem fundo),
 * JPG (com a qualidade escolhida) ou PDF no tamanho da arte, com uma folha
 * por página do projeto (carrossel). PNG e JPG são sempre de uma página: o
 * editor pede uma por vez. A conta mora em lib/banner-editor/arquivo-da-arte.ts
 * (a mesma do link público e do assistente); o cabeçalho X-Escala diz qual
 * escala valeu.
 *
 * Nada é guardado: o arquivo volta direto para o navegador de quem pediu.
 */

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

export async function POST(req: Request) {
  const acesso = await quemPodeCriarArtes();
  if (acesso.falha) return erro(acesso.falha.texto, acesso.falha.status);
  const corpo = (await req.json().catch(() => null)) as Record<string, unknown> | null;
  if (!corpo) return erro("Pedido inválido.", 400);

  const largura = Math.round(Number(corpo.largura));
  const altura = Math.round(Number(corpo.altura));
  if (!Number.isFinite(largura) || !Number.isFinite(altura) || largura < MINIMO_DO_LADO || altura < MINIMO_DO_LADO || largura > LIMITE_DO_LADO || altura > LIMITE_DO_LADO) {
    return erro("Tamanho da arte inválido.", 400);
  }
  const formato = corpo.formato === "jpg" || corpo.formato === "pdf" ? corpo.formato : "png";

  try {
    const { conteudo, tipo, escala } = await arquivoDaArte(documentoLimpo(corpo.documento, largura, altura), {
      formato,
      escala: Number(corpo.escala),
      transparente: corpo.transparente === true,
      espelhar: corpo.espelhar === true,
      qualidade: Number(corpo.qualidade),
      grafica: corpo.grafica === true,
    });
    return new NextResponse(new Uint8Array(conteudo), {
      status: 200,
      headers: {
        "Content-Type": tipo,
        "Content-Disposition": `attachment; filename="${nomeDoArquivo(corpo.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] exportar", falha instanceof Error ? falha.message : falha);
    return erro("Não deu para gerar a arte agora. Tente de novo em instantes.", 500);
  }
}
