import { NextRequest, NextResponse } from 'next/server';
import { Subscription, MembershipTier } from '../../../types/membership';
import { AccessControl } from '../../../lib/accessControl';

// Mock database - in real app this would be Firestore
let subscriptions: Subscription[] = [];

export async function GET(request: NextRequest) {
  try {
    const { searchParams } = new URL(request.url);
    const userId = searchParams.get('userId');

    if (!userId) {
      return NextResponse.json(
        { error: 'User ID is required' },
        { status: 400 }
      );
    }

    const userSubscription = subscriptions.find(sub => sub.userId === userId);
    
    return NextResponse.json({
      subscription: userSubscription || null,
      hasActiveSubscription: AccessControl.isSubscriptionActive(userSubscription)
    });
  } catch (error) {
    console.error('Error fetching subscription:', error);
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}

export async function POST(request: NextRequest) {
  try {
    const body = await request.json();
    const { userId, plan, stripeSubscriptionId } = body;

    if (!userId || !plan) {
      return NextResponse.json(
        { error: 'User ID and plan are required' },
        { status: 400 }
      );
    }

    // Check if user already has a subscription
    const existingSubscription = subscriptions.find(sub => sub.userId === userId);
    if (existingSubscription) {
      return NextResponse.json(
        { error: 'User already has a subscription' },
        { status: 409 }
      );
    }

    // Create new subscription
    const newSubscription: Subscription = {
      id: `sub_${Date.now()}`,
      userId,
      plan: plan as MembershipTier,
      status: 'active',
      currentPeriodStart: new Date(),
      currentPeriodEnd: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days
      cancelAtPeriodEnd: false,
      stripeSubscriptionId,
      createdAt: new Date(),
      updatedAt: new Date()
    };

    subscriptions.push(newSubscription);

    return NextResponse.json({
      subscription: newSubscription,
      message: 'Subscription created successfully'
    }, { status: 201 });
  } catch (error) {
    console.error('Error creating subscription:', error);
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}

export async function PUT(request: NextRequest) {
  try {
    const body = await request.json();
    const { subscriptionId, updates } = body;

    if (!subscriptionId) {
      return NextResponse.json(
        { error: 'Subscription ID is required' },
        { status: 400 }
      );
    }

    const subscriptionIndex = subscriptions.findIndex(sub => sub.id === subscriptionId);
    if (subscriptionIndex === -1) {
      return NextResponse.json(
        { error: 'Subscription not found' },
        { status: 404 }
      );
    }

    // Update subscription
    subscriptions[subscriptionIndex] = {
      ...subscriptions[subscriptionIndex],
      ...updates,
      updatedAt: new Date()
    };

    return NextResponse.json({
      subscription: subscriptions[subscriptionIndex],
      message: 'Subscription updated successfully'
    });
  } catch (error) {
    console.error('Error updating subscription:', error);
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}

export async function DELETE(request: NextRequest) {
  try {
    const { searchParams } = new URL(request.url);
    const subscriptionId = searchParams.get('id');

    if (!subscriptionId) {
      return NextResponse.json(
        { error: 'Subscription ID is required' },
        { status: 400 }
      );
    }

    const subscriptionIndex = subscriptions.findIndex(sub => sub.id === subscriptionId);
    if (subscriptionIndex === -1) {
      return NextResponse.json(
        { error: 'Subscription not found' },
        { status: 404 }
      );
    }

    // Cancel subscription (soft delete)
    subscriptions[subscriptionIndex] = {
      ...subscriptions[subscriptionIndex],
      status: 'canceled',
      cancelAtPeriodEnd: true,
      updatedAt: new Date()
    };

    return NextResponse.json({
      subscription: subscriptions[subscriptionIndex],
      message: 'Subscription canceled successfully'
    });
  } catch (error) {
    console.error('Error canceling subscription:', error);
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
} 