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 { requireAuth, requireAdmin } from '@/lib/auth';

interface Params {
  params: { id: string };
}

// GET /api/subscriptions/[id]
export async function GET(req: NextRequest, { params }: Params) {
  const auth = requireAuth(req);
  if (auth instanceof NextResponse) return auth;

  try {
    await dbConnect();
    const subscription = await Subscription.findById(params.id)
      .populate('course')
      .populate('student', 'name email phoneNumber')
      .populate('manualExtensionLogs.extendedBy', 'name email');

    if (!subscription) {
      return NextResponse.json({ success: false, error: 'Subscription not found' }, { status: 404 });
    }

    if (auth.user.role === 'student' && subscription.student._id.toString() !== auth.user.id) {
      return NextResponse.json({ success: false, error: 'Forbidden' }, { status: 403 });
    }

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

// DELETE /api/subscriptions/[id] - Admin revokes/removes subscription
export async function DELETE(req: NextRequest, { params }: Params) {
  const auth = requireAdmin(req);
  if (auth instanceof NextResponse) return auth;

  try {
    await dbConnect();
    const deleted = await Subscription.findByIdAndDelete(params.id);
    if (!deleted) {
      return NextResponse.json({ success: false, error: 'Subscription not found' }, { status: 404 });
    }

    return NextResponse.json({
      success: true,
      message: 'Subscription removed successfully',
    });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Server error deleting subscription' },
      { status: 500 }
    );
  }
}

// PATCH /api/subscriptions/[id] - Admin updates subscription details (like expiry date)
export async function PATCH(req: NextRequest, { params }: Params) {
  const auth = requireAdmin(req);
  if (auth instanceof NextResponse) return auth;

  try {
    await dbConnect();
    const body = await req.json();
    
    const subscription = await Subscription.findById(params.id);
    if (!subscription) {
      return NextResponse.json({ success: false, error: 'Subscription not found' }, { status: 404 });
    }

    if (body.expiryDate) {
      const previousExpiryDate = subscription.expiryDate;
      subscription.expiryDate = new Date(body.expiryDate);
      
      // Log manual extension
      if (!subscription.manualExtensionLogs) {
        subscription.manualExtensionLogs = [];
      }
      subscription.manualExtensionLogs.push({
        extendedAt: new Date(),
        extendedBy: auth.user.id as any,
        previousExpiryDate,
        newExpiryDate: new Date(body.expiryDate),
        reason: body.reason || 'Manual Admin Update'
      });
      
      if (subscription.expiryDate > new Date()) {
        subscription.status = 'active';
      } else {
        subscription.status = 'expired';
      }
    }

    if (body.status) {
      subscription.status = body.status;
    }

    await subscription.save();

    return NextResponse.json({
      success: true,
      message: 'Subscription updated successfully',
      subscription
    });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Server error updating subscription' },
      { status: 500 }
    );
  }
}
