import { NextRequest, NextResponse } from 'next/server';
import { dbConnect } from '@/lib/dbConnect';
import { getStripeInstance, fulfillStripeOrder } from '@/lib/stripe';
import { Order } from '@/models/Order';

// POST /api/payments/verify-intent
// Verifies Stripe PaymentIntent status and fulfills order upon successful payment
export async function POST(req: NextRequest) {
  try {
    await dbConnect();
    const body = await req.json();
    const { paymentIntentId, orderId } = body;

    if (!paymentIntentId && !orderId) {
      return NextResponse.json(
        { success: false, error: 'paymentIntentId or orderId is required' },
        { status: 400 }
      );
    }

    const { stripe } = await getStripeInstance();

    let targetOrderId = orderId;
    let intentId = paymentIntentId;

    if (targetOrderId && !intentId) {
      const order = await Order.findById(targetOrderId);
      if (order && order.gatewayTransactionId) {
        intentId = order.gatewayTransactionId;
      }
    }

    if (!intentId) {
      return NextResponse.json(
        { success: false, error: 'PaymentIntent ID could not be determined' },
        { status: 400 }
      );
    }

    // Retrieve status directly from Stripe API
    const paymentIntent = await stripe.paymentIntents.retrieve(intentId);

    if (paymentIntent.status === 'succeeded') {
      const resolvedOrderId = targetOrderId || paymentIntent.metadata?.orderId;
      if (!resolvedOrderId) {
        return NextResponse.json(
          { success: false, error: 'Order ID not found in PaymentIntent metadata' },
          { status: 400 }
        );
      }

      const order = await fulfillStripeOrder(resolvedOrderId, paymentIntent.id, paymentIntent as any);

      return NextResponse.json({
        success: true,
        message: 'Payment verified and order fulfilled successfully',
        paymentStatus: 'succeeded',
        order,
      });
    } else {
      return NextResponse.json({
        success: false,
        message: `Payment status is ${paymentIntent.status}`,
        paymentStatus: paymentIntent.status,
      });
    }
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Payment verification failed' },
      { status: 500 }
    );
  }
}
