import { NextRequest, NextResponse } from "next/server";
import puppeteer from "puppeteer";

// Ensure this route runs in the Node.js runtime (required for Puppeteer)
export const runtime = "nodejs";

type PaperSize = {
  type?: "A4" | "Letter" | "Legal" | "Custom";
  width?: number;
  height?: number;
  unit?: "mm" | "in";
};

export async function POST(req: NextRequest) {
  try {
    const body = await req.json();
    const {
      htmlContent,
      paperSize,
      fileName,
      showLogoInHeader,
      startFromHalfPage,
      companyLogo,
    }: { 
      htmlContent: string; 
      paperSize?: PaperSize; 
      fileName?: string;
      showLogoInHeader?: boolean;
      startFromHalfPage?: boolean;
      companyLogo?: string;
    } = body;

    if (!htmlContent) {
      return NextResponse.json(
        { message: "htmlContent is required" },
        { status: 400 },
      );
    }

    const widthMm = paperSize?.width || 210;
    const heightMm = paperSize?.height || 297;
    const pageSizeCss = `${widthMm}mm ${heightMm}mm`;

    // Generate header HTML if logo should be shown
    const headerHtml = showLogoInHeader ? `
      <div class="document-header">
        ${companyLogo ? `<img src="${companyLogo}" alt="Company Logo" class="company-logo" />` : '<div class="company-logo-placeholder">Company Logo</div>'}
      </div>
    ` : '';

    // Generate spacer HTML if content should start from half page
    const spacerHtml = startFromHalfPage ? `
      <div class="half-page-spacer"></div>
    ` : '';

    const fullHtml = `<!DOCTYPE html>
<html>
<head>
  <meta charSet="UTF-8" />
  <style>
    @page {
      size: ${pageSizeCss};
      margin: 20mm;
      @bottom-center {
        content: "Page " counter(page);
      }
    }

    body {
      font-family: Arial, sans-serif;
      font-size: 12pt;
      line-height: 1.4;
    }

    .document {
      width: 100%;
    }

    .document-header {
      text-align: center;
      padding-bottom: 20px;
      border-bottom: 1px solid #ddd;
      margin-bottom: 20px;
    }

    .company-logo {
      max-width: 150px;
      max-height: 60px;
      object-fit: contain;
    }

    .company-logo-placeholder {
      font-weight: bold;
      font-size: 18pt;
      color: #666;
    }

    .half-page-spacer {
      height: calc(${heightMm}mm / 2 - 40mm);
      border-bottom: 2px dashed #ddd;
      margin-bottom: 20px;
    }

    /* Table layout for PDF */
    table {
      width: 100%;
      border-collapse: collapse;
      border: 1px solid #000;
    }

    th, td {
      border: 1px solid #000;
      padding: 4px;
    }

    thead {
      display: table-header-group;
    }

    table, img {
      page-break-inside: avoid;
    }
  </style>
</head>
<body>
  <div class="document">
    ${headerHtml}
    ${spacerHtml}
    <div id="editorContent">
      ${htmlContent}
    </div>
  </div>
</body>
</html>`;

    const browser = await puppeteer.launch({
      headless: "new",
      args: ["--no-sandbox", "--disable-setuid-sandbox"],
    });

    const page = await browser.newPage();
    await page.setContent(fullHtml, { waitUntil: "networkidle0" });

    const pdfBuffer = await page.pdf({
      printBackground: true,
      preferCSSPageSize: true,
    });

    await browser.close();

    return new NextResponse(pdfBuffer, {
      status: 200,
      headers: {
        "Content-Type": "application/pdf",
        "Content-Disposition": `inline; filename="${fileName || "document"}.pdf"`,
      },
    });
  } catch (error: any) {
    console.error("Error generating PDF:", error);
    return NextResponse.json(
      { message: "Failed to generate PDF" },
      { status: 500 },
    );
  }
}
