import { NextResponse } from 'next/server';
import mongoose from 'mongoose';
import connectToDatabase from '@/lib/db';
import WebinarModel from '@/lib/models/webinar';

export const runtime = 'nodejs';

export async function GET(request: Request) {
  try {
    await connectToDatabase();
    const Webinar = mongoose.models.webinars || WebinarModel(mongoose);

    const { searchParams } = new URL(request.url);
    const isAdmin = searchParams.get('admin') === 'true';

    let webinars;
    if (isAdmin) {
      // Admin sees all webinars, sorted newest first
      webinars = await Webinar.find({}).sort({ createdAt: -1 });
    } else {
      // Public sees Scheduled or Rescheduled webinars, sorted by date/time ascending
      webinars = await Webinar.find({
        status: { $in: ['Scheduled', 'Rescheduled'] }
      }).sort({ date: 1, startTime: 1 });
    }

    return NextResponse.json({ success: true, data: webinars }, { status: 200 });
  } catch (error: any) {
    console.error('Error fetching webinars:', error);
    return NextResponse.json(
      { error: 'Failed to fetch webinars.', details: error.message || String(error) },
      { status: 500 }
    );
  }
}

export async function POST(request: Request) {
  try {
    const body = await request.json();
    const {
      title,
      description,
      date,
      startTime,
      endTime,
      googleMeetLink,
      status,
      slotsEnabled,
      slots,
      cancelledReason,
      rescheduledFromDate,
      rescheduledFromStartTime
    } = body;

    if (!title || !date || !startTime) {
      return NextResponse.json(
        { error: 'Title, date, and start time are required.' },
        { status: 400 }
      );
    }

    await connectToDatabase();
    const Webinar = mongoose.models.webinars || WebinarModel(mongoose);

    // Create a slug from title
    const slug = title
      .trim()
      .toLowerCase()
      .replace(/[^a-z0-9]+/g, '-')
      .replace(/(^-|-$)/g, '');

    const newWebinar = new Webinar({
      title,
      slug,
      description,
      date,
      startTime,
      endTime,
      googleMeetLink,
      status: status || 'Scheduled',
      slotsEnabled: Boolean(slotsEnabled),
      slots: slots || [],
      cancelledReason,
      rescheduledFromDate,
      rescheduledFromStartTime
    });

    await newWebinar.save();

    return NextResponse.json({ success: true, data: newWebinar }, { status: 201 });
  } catch (error: any) {
    console.error('Error creating 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 create webinar. Please try again later.' },
      { status: 500 }
    );
  }
}
