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

// POST /api/payments/webhook
// Stripe webhook endpoint for asynchronous payment event handling.
// Creates & fulfills Order ONLY after payment succeeds!
export async function POST(req: NextRequest) {
  try {
    await dbConnect();
    const rawBody = await req.text();
    const signature = req.headers.get('stripe-signature');

    const { stripe } = await getStripeInstance();
    const settings = await Settings.getSettings();
    const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET || '';

    let event: any;

    if (webhookSecret && signature) {
      try {
        event = stripe.webhooks.constructEvent(rawBody, signature, webhookSecret);
      } catch (err: any) {
        return NextResponse.json(
          { success: false, error: `Webhook Signature Error: ${err.message}` },
          { status: 400 }
        );
      }
    } else {
      event = JSON.parse(rawBody);
    }

    if (event.type === 'checkout.session.completed' || event.type === 'payment_intent.succeeded') {
      const sessionOrIntent = event.data.object;
      if (sessionOrIntent.payment_status === 'paid' || event.type === 'payment_intent.succeeded') {
        await createAndFulfillStripeOrderFromSession(sessionOrIntent);
      }
    }

    return NextResponse.json({ received: true });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Webhook handler error' },
      { status: 500 }
    );
  }
}
