import { NextRequest, NextResponse } from 'next/server' import { stripe } from '@/lib/stripe-server' import { dollarsToCents } from '@/lib/stripe' import { prisma } from '@/lib/db' export async function POST(req: NextRequest) { try { const body = await req.json() const { amount, email, name, message, isAnonymous, isRecurring, recurringInterval, locale } = body // Validate required fields if (!amount || !email) { return NextResponse.json( { error: 'Amount and email are required' }, { status: 400 } ) } // Convert amount to cents const amountInCents = dollarsToCents(parseFloat(amount)) // Validate amount (minimum $1) if (amountInCents < 100) { return NextResponse.json( { error: 'Minimum donation amount is $1' }, { status: 400 } ) } // Get the base URL for redirects const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3010' const userLocale = locale || 'en' // Create checkout session parameters const sessionParams: any = { payment_method_types: ['card'], line_items: [ { price_data: { currency: 'usd', product_data: { name: 'Donation to Biblical Guide', description: 'Support Biblical Guide - Every Scripture. Every Language. Forever Free.', images: [`${baseUrl}/icon.png`], }, unit_amount: amountInCents, }, quantity: 1, }, ], mode: isRecurring ? 'subscription' : 'payment', success_url: `${baseUrl}/${userLocale}/donate/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${baseUrl}/${userLocale}/donate?canceled=true`, customer_email: email, metadata: { donorName: name || 'Anonymous', donorMessage: message || '', isAnonymous: isAnonymous ? 'true' : 'false', }, } // Add recurring interval if applicable if (isRecurring && recurringInterval) { sessionParams.line_items[0].price_data.recurring = { interval: recurringInterval, } } // Create Stripe checkout session const session = await stripe.checkout.sessions.create(sessionParams) // Create donation record in database with PENDING status await prisma.donation.create({ data: { stripeSessionId: session.id, email, name: name || null, amount: amountInCents, currency: 'usd', status: 'PENDING', message: message || null, isAnonymous: isAnonymous || false, isRecurring: isRecurring || false, recurringInterval: recurringInterval || null, metadata: { sessionUrl: session.url, }, }, }) return NextResponse.json({ sessionId: session.id, url: session.url }) } catch (error) { console.error('Error creating checkout session:', error) return NextResponse.json( { error: 'Failed to create checkout session' }, { status: 500 } ) } }