import { NextRequest, NextResponse } from "next/server";
import { requireAuth } from "./auth-check";

const STIRLING_PDF_URL = process.env.STIRLING_PDF_URL;
const STIRLING_PDF_API_KEY = process.env.STIRLING_PDF_API_KEY;

export async function POST(req: NextRequest) {
  const authErr = await requireAuth(req);
  if (authErr) return authErr;

  if (!STIRLING_PDF_URL || !STIRLING_PDF_API_KEY) {
    return NextResponse.json(
      { error: "Stirling PDF nu este configurat" },
      { status: 503 },
    );
  }

  try {
    // Buffer the full body then forward to Stirling — streaming passthrough
    // (req.body + duplex:half) is unreliable for large files in Next.js.
    const bodyBytes = await req.arrayBuffer();
    const contentType = req.headers.get("content-type") || "";

    // Extract original file size from the multipart body for the response header
    // (rough estimate — the overhead of multipart framing is negligible for large PDFs)
    const originalSize = bodyBytes.byteLength;

    const res = await fetch(`${STIRLING_PDF_URL}/api/v1/misc/compress-pdf`, {
      method: "POST",
      headers: {
        "X-API-KEY": STIRLING_PDF_API_KEY,
        "Content-Type": contentType,
      },
      body: bodyBytes,
      signal: AbortSignal.timeout(300_000), // 5 min for large files
    });

    if (!res.ok) {
      const text = await res.text().catch(() => res.statusText);
      return NextResponse.json(
        { error: `Stirling PDF error: ${res.status} — ${text}` },
        { status: res.status },
      );
    }

    const blob = await res.blob();
    const buffer = Buffer.from(await blob.arrayBuffer());

    return new NextResponse(new Uint8Array(buffer), {
      status: 200,
      headers: {
        "Content-Type": "application/pdf",
        "Content-Disposition": 'attachment; filename="compressed.pdf"',
        "X-Original-Size": String(originalSize),
        "X-Compressed-Size": String(buffer.length),
      },
    });
  } catch (err) {
    const message = err instanceof Error ? err.message : "Unknown error";
    return NextResponse.json(
      { error: `Nu s-a putut contacta Stirling PDF: ${message}` },
      { status: 502 },
    );
  }
}
