import { NextRequest, NextResponse } from 'next/server';
import { dbConnect } from '@/lib/dbConnect';
import { Subscription } from '@/models/Subscription';
import { Course } from '@/models/Course';
import { Student } from '@/models/Student';
import { Admin } from '@/models/Admin';
import { Settings } from '@/models/Settings';
import { requireAuth } from '@/lib/auth';
import { validateFields } from '@/lib/validation';

// GET /api/subscriptions - List subscriptions
export async function GET(req: NextRequest) {
  const auth = requireAuth(req);
  if (auth instanceof NextResponse) return auth;

  try {
    await dbConnect();
    const { searchParams } = new URL(req.url);
    const isAdmin = auth.user.role === 'admin' || auth.user.role === 'super_admin';

    const query: Record<string, any> = {};

    if (!isAdmin) {
      // Students can only see their own subscriptions
      query.student = auth.user.id;
    } else {
      const studentId = searchParams.get('student');
      const courseId = searchParams.get('course');
      const status = searchParams.get('status');

      if (studentId) query.student = studentId;
      if (courseId) query.course = courseId;
      if (status) query.status = status;
    }

    const subscriptions = await Subscription.find(query)
      .populate('course', 'title level courseType slug regularPrice offerPrice thumbnailUrl chapters.chapterNumber chapters.title')
      .populate('student', 'name email phoneNumber status')
      .populate('manualExtensionLogs.extendedBy', 'name email')
      .sort({ createdAt: -1 });

    return NextResponse.json({
      success: true,
      count: subscriptions.length,
      subscriptions,
    });
  } catch (error: any) {
    console.error('[GET /api/subscriptions Error]:', error);
    return NextResponse.json(
      { success: false, error: error.message || 'Server error fetching subscriptions', details: error.toString() },
      { status: 500 }
    );
  }
}

// POST /api/subscriptions - Admin manually grants a course subscription
export async function POST(req: NextRequest) {
  const auth = requireAuth(req);
  if (auth instanceof NextResponse) return auth;

  // Only admin or internal order processor can directly create subscriptions
  if (auth.user.role !== 'admin' && auth.user.role !== 'super_admin') {
    return NextResponse.json({ success: false, error: 'Forbidden: Admin access required' }, { status: 403 });
  }

  try {
    await dbConnect();
    const body = await req.json();

    const { isValid, errorResponse } = validateFields(body, ['studentId', 'courseId']);
    if (!isValid) return errorResponse;

    const { studentId, courseId, customMonths, orderId } = body;

    const course = await Course.findById(courseId);
    if (!course) {
      return NextResponse.json({ success: false, error: 'Course not found' }, { status: 404 });
    }

    const settings = await Settings.getSettings();
    const durationMonths = customMonths || course.validityMonths || settings.defaultCourseExpiryMonths || 4;

    const startDate = new Date();
    const expiryDate = new Date();
    expiryDate.setMonth(expiryDate.getMonth() + durationMonths);

    // Check if subscription already exists
    let subscription = await Subscription.findOne({ student: studentId, course: courseId });

    if (subscription) {
      // Extend existing subscription
      subscription.expiryDate = expiryDate;
      subscription.status = 'active';
      await subscription.save();
    } else {
      subscription = await Subscription.create({
        student: studentId,
        course: courseId,
        order: orderId || undefined,
        startDate,
        expiryDate,
        status: 'active',
        completedChapters: [],
        completedPercent: 0,
        lastWatchedPositionSeconds: 0,
      });
    }

    return NextResponse.json(
      {
        success: true,
        message: 'Subscription created/activated successfully',
        subscription,
      },
      { status: 201 }
    );
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Server error creating subscription' },
      { status: 500 }
    );
  }
}
