import { NextResponse } from 'next/server';
import mongoose from 'mongoose';
import connectToDatabase from '@/lib/db';
import DemoModel from '@/lib/models/demo';

export const runtime = 'nodejs';

// Helper to find demo by ID
async function findDemo(demoId: string, Demo: any) {
  if (mongoose.Types.ObjectId.isValid(demoId)) {
    return await Demo.findById(demoId);
  }
  // If we were to implement slugs for demos, this is where we'd check
  return null; 
}

export async function GET(
  _request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;
    await connectToDatabase();
    const Demo = mongoose.models.demos || DemoModel(mongoose);
    const demo = await findDemo(id, Demo);
    if (!demo) {
      return NextResponse.json({ error: 'Demo request not found.' }, { status: 404 });
    }
    return NextResponse.json({ success: true, data: demo }, { status: 200 });
  } catch (error) {
    console.error('Error fetching demo request:', error);
    return NextResponse.json(
      { error: 'Failed to fetch demo request. Please try again later.' },
      { status: 500 }
    );
  }
}

export async function PATCH(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;
    const body = await request.json();

    await connectToDatabase();
    const Demo = mongoose.models.demos || DemoModel(mongoose);

    const demo = await findDemo(id, Demo);
    if (!demo) {
      return NextResponse.json({ error: 'Demo request not found.' }, { status: 404 });
    }

    const {
      title,
      description,
      date,
      scheduledDate,
      startTime,
      scheduledTime,
      endTime,
      timezone,
      googleMeetLink,
      status,
      notes,
      slotsEnabled,
      slots,
    } = body;

    if (title !== undefined) demo.title = title;
    if (description !== undefined) demo.description = description;
    if (date !== undefined) demo.date = date;
    else if (scheduledDate !== undefined) demo.date = scheduledDate;
    
    if (startTime !== undefined) demo.startTime = startTime;
    else if (scheduledTime !== undefined) demo.startTime = scheduledTime;
    
    if (endTime !== undefined) demo.endTime = endTime;
    if (timezone !== undefined) demo.timezone = timezone;
    if (googleMeetLink !== undefined) demo.googleMeetLink = googleMeetLink;
    if (status !== undefined) demo.status = status;
    if (notes !== undefined) demo.notes = notes;
    if (slotsEnabled !== undefined) demo.slotsEnabled = Boolean(slotsEnabled);
    if (slots !== undefined) demo.slots = slots;

    await demo.save();

    return NextResponse.json({ success: true, data: demo }, { status: 200 });
  } catch (error: any) {
    console.error('Error updating demo request:', error);
    if (error.name === 'ValidationError') {
      const messages = Object.values(error.errors).map((val: any) => val.message);
      return NextResponse.json(
        { error: `Validation Error: ${messages.join(', ')}` },
        { status: 400 }
      );
    }
    return NextResponse.json(
      { error: error.message || 'Failed to update demo request. Please try again later.' },
      { status: 500 }
    );
  }
}

export async function DELETE(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;

    await connectToDatabase();
    const Demo = mongoose.models.demos || DemoModel(mongoose);

    const demo = await findDemo(id, Demo);
    if (!demo) {
      return NextResponse.json({ error: 'Demo request not found.' }, { status: 404 });
    }

    await Demo.deleteOne({ _id: demo._id });

    // Note: If demo registrations were to be implemented, they would be deleted here.

    return NextResponse.json(
      { success: true, message: 'Demo request deleted successfully.' },
      { status: 200 }
    );
  } catch (error: any) {
    console.error('Error deleting demo request:', error);
    return NextResponse.json(
      { error: error.message || 'Failed to delete demo request. Please try again later.' },
      { status: 500 }
    );
  }
}
