import { NextResponse } from 'next/server';
import mongoose from 'mongoose';
import connectToDatabase from '@/lib/db';
import WebinarModel from '@/lib/models/webinar';

export const runtime = 'nodejs';

// Helper to find webinar by ID or slug
async function findWebinar(webinarId: string, Webinar: any) {
  if (mongoose.Types.ObjectId.isValid(webinarId)) {
    return await Webinar.findById(webinarId);
  }
  return await Webinar.findOne({ slug: webinarId });
}

export async function GET(
  _request: Request,
  { params }: { params: Promise<{ webinarId: string }> }
) {
  try {
    const { webinarId } = await params;
    await connectToDatabase();
    const Webinar = mongoose.models.webinars || WebinarModel(mongoose);
    const webinar = await findWebinar(webinarId, Webinar);
    if (!webinar) {
      return NextResponse.json({ error: 'Webinar not found.' }, { status: 404 });
    }
    return NextResponse.json({ success: true, data: webinar }, { status: 200 });
  } catch (error) {
    console.error('Error fetching webinar:', error);
    return NextResponse.json(
      { error: 'Failed to fetch webinar. Please try again later.' },
      { status: 500 }
    );
  }
}

export async function PUT(
  request: Request,
  { params }: { params: Promise<{ webinarId: string }> }
) {
  try {
    const { webinarId } = await params;
    const body = await request.json();

    await connectToDatabase();
    const Webinar = mongoose.models.webinars || WebinarModel(mongoose);

    const webinar = await findWebinar(webinarId, Webinar);
    if (!webinar) {
      return NextResponse.json({ error: 'Webinar not found.' }, { status: 404 });
    }

    const {
      title,
      description,
      date,
      startTime,
      endTime,
      googleMeetLink,
      status,
      slotsEnabled,
      slots,
      cancelledReason,
      rescheduledFromDate,
      rescheduledFromStartTime
    } = body;

    if (title) {
      webinar.title = title;
      // Auto regenerate slug if title changes
      webinar.slug = title
        .trim()
        .toLowerCase()
        .replace(/[^a-z0-9]+/g, '-')
        .replace(/(^-|-$)/g, '');
    }
    if (description !== undefined) webinar.description = description;
    if (date) webinar.date = date;
    if (startTime) webinar.startTime = startTime;
    if (endTime !== undefined) webinar.endTime = endTime;
    if (googleMeetLink !== undefined) webinar.googleMeetLink = googleMeetLink;
    if (status) webinar.status = status;
    if (slotsEnabled !== undefined) webinar.slotsEnabled = Boolean(slotsEnabled);
    if (slots !== undefined) webinar.slots = slots;
    if (cancelledReason !== undefined) webinar.cancelledReason = cancelledReason;
    if (rescheduledFromDate !== undefined) webinar.rescheduledFromDate = rescheduledFromDate;
    if (rescheduledFromStartTime !== undefined) webinar.rescheduledFromStartTime = rescheduledFromStartTime;

    await webinar.save();

    return NextResponse.json({ success: true, data: webinar }, { status: 200 });
  } catch (error: any) {
    console.error('Error updating webinar:', error);
    if (error.code === 11000) {
      return NextResponse.json(
        { error: 'A webinar with this title or slug already exists.' },
        { status: 400 }
      );
    }
    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 webinar. Please try again later.' },
      { status: 500 }
    );
  }
}

export async function DELETE(
  request: Request,
  { params }: { params: Promise<{ webinarId: string }> }
) {
  try {
    const { webinarId } = await params;

    await connectToDatabase();
    const Webinar = mongoose.models.webinars || WebinarModel(mongoose);

    const webinar = await findWebinar(webinarId, Webinar);
    if (!webinar) {
      return NextResponse.json({ error: 'Webinar not found.' }, { status: 404 });
    }

    await Webinar.deleteOne({ _id: webinar._id });

    // Also delete registrations associated with this webinar
    const WebinarRegistration =
      mongoose.models.webinar_registrations ||
      (await import('@/lib/models/webinar-registration')).default(mongoose);
    
    await WebinarRegistration.deleteMany({ webinarId: webinar._id });

    return NextResponse.json(
      { success: true, message: 'Webinar and its registrations deleted successfully.' },
      { status: 200 }
    );
  } catch (error: any) {
    console.error('Error deleting webinar:', error);
    return NextResponse.json(
      { error: error.message || 'Failed to delete webinar. Please try again later.' },
      { status: 500 }
    );
  }
}
