import type { NextApiRequest, NextApiResponse } from 'next';
import prisma from '@/prisma/config';
import PDFDocument from 'pdfkit';
import path from 'path';
import fs from 'fs';

/**
 * Create a contract PDF.
 * Expected body: propertyId, landlordId, tenantId, contractType, templateData (JSON object)
 */
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.method !== 'POST') {
    return res.status(405).json({ error: 'Method not allowed' });
  }
  const { propertyId, landlordId, tenantId, contractType, templateData } = req.body as any;

  if (!propertyId || !landlordId || !tenantId || !contractType) {
    return res.status(400).json({ error: 'Missing required fields' });
  }

  try {
    // Create contract record first (status draft)
    const contract = await prisma.contract.create({
      data: {
        propertyId: Number(propertyId),
        landlordId: Number(landlordId),
        tenantId: Number(tenantId),
        contractType,
        templateData: templateData ? JSON.stringify(templateData) : undefined,
        status: 'draft',
      },
    });

    // Generate PDF using pdfkit
    const doc = new PDFDocument({ margin: 50 });
    const pdfPath = path.join(process.cwd(), 'public', 'contracts', `${contract.id}.pdf`);
    // Ensure directory exists
    fs.mkdirSync(path.dirname(pdfPath), { recursive: true });
    const stream = fs.createWriteStream(pdfPath);
    doc.pipe(stream);

    // Simple template – replace merge tags from templateData
    const data = templateData || {};
    const replaceTags = (text: string) =>
      text.replace(/{{\s*(\w+)\s*}}/g, (_, key) => (data[key] ?? ''));

    doc.fontSize(20).text('Contract', { align: 'center' });
    doc.moveDown();
    doc.fontSize(12);
    const sections = [
      `Date: ${new Date().toLocaleDateString()}`,
      `Contract Type: ${contractType}`,
      `Property ID: ${propertyId}`,
      `Landlord ID: ${landlordId}`,
      `Tenant ID: ${tenantId}`,
      `---`,
      replaceTags('Client Name: {{client_name}}'),
      replaceTags('Rent Amount: {{rent_amount}}'),
      replaceTags('Property Address: {{property_address}}'),
      replaceTags('Payment Due Date: {{payment_due_date}}'),
      `---`,
      'Signature: ______________________',
    ];
    sections.forEach((line) => doc.text(line));
    doc.end();

    // Wait for PDF to finish writing
    await new Promise((resolve, reject) => {
      stream.on('finish', resolve);
      stream.on('error', reject);
    });

    // Update contract record with pdf path
    await prisma.contract.update({
      where: { id: contract.id },
      data: { pdfPath: `/contracts/${contract.id}.pdf`, status: 'generated' },
    });

    res.status(201).json({ contractId: contract.id, pdfUrl: `/contracts/${contract.id}.pdf` });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Failed to create contract' });
  }
}
