import { db } from '@/lib/db';
import { executePayment } from '@/utils/bkash/bkash';
import { PaymentStatus } from '@prisma/client';
import { NextRequest, NextResponse } from 'next/server';


export async function GET(request: Request) {

    const url = new URL(request.url);
    const paymentID = url.searchParams.get('paymentID');
    const status = url.searchParams.get('status');
    const signature = url.searchParams.get('signature');
    const apiVersion = url.searchParams.get('apiVersion');

    console.log(`Payment ID: ${paymentID}, Status: ${status}, Signature: ${signature}, API Version: ${apiVersion}`);

    const payment = await db.payments.findFirst({
        where: { paymentID }
    })

    if (!payment) {
        return NextResponse.json({ error: 'Payment not found' }, { status: 404 })
    }


    if (!status || !paymentID) {
        return NextResponse.json({ error: 'Missing parameter' }, { status: 400 });
    }

    switch (status.toLowerCase()) {
        case 'success':

            const response = await executePayment(paymentID)

            console.log(response)

            console.log(response.data)

            console.log(response.status)

            if (response.status != 200) {

                await db.payments.update({
                    where: { id: payment.id },
                    data: {
                        payment_status: PaymentStatus.FAILED,
                        transactionID: null
                    }
                })

                return NextResponse.json({ mssg: 'BKASH Payment could not be completed' }, { status: 500 })
            }

            const successPayment = await db.payments.update({
                where: { id: payment.id },
                include: {
                    order: true
                },
                data: {
                    payment_status: PaymentStatus.PAID,
                    transactionID: response.data.trxID
                }
            })


            console.log(`✅ Payment Successful - ID: ${paymentID}`)

            if (typeof successPayment.order?.id === 'number') {
                return NextResponse.redirect(new URL(`/payment?status=success&orderNumber=${uuidToOrderNumber(successPayment.order.id)}`, request.url))
            } else {
                return NextResponse.redirect(new URL('/payment?status=success&orderNumber=NA', request.url))
            }

        case 'failure':
            var IsPaymentPaid = await db.payments.findUnique({
                where: { id: payment.id }
            })

            if (IsPaymentPaid?.payment_status === PaymentStatus.PAID) {
                return NextResponse.redirect(new URL('/Invalid request', request.url))
            }

            await db.payments.update({
                where: { id: payment.id },
                data: { payment_status: PaymentStatus.FAILED }
            })
            console.log(`❌ Payment Failed - ID: ${paymentID}`)
            return NextResponse.redirect(new URL('/payment?status=failed&orderNumber=NA', request.url))

        case 'cancel':
            var IsPaymentPaid = await db.payments.findUnique({
                where: { id: payment.id }
            })

            if (IsPaymentPaid?.payment_status === PaymentStatus.PAID) {
                return NextResponse.redirect(new URL('/invalid request', request.url))
            }

            await db.payments.update({
                where: { id: payment.id },
                data: { payment_status: PaymentStatus.FAILED } // make it CANCELLED
            })
            console.log(`❌ Payment Failed - ID: ${paymentID}`)
            return NextResponse.redirect(new URL('/payment?status=cancel&orderNumber=NA', request.url))

        default:
            return NextResponse.json({ error: 'Invalid status value' }, { status: 400 })
    }


    // return NextResponse.json({ mssg: "Successfully received payment details" }, { status: 200 });
}


function uuidToOrderNumber(id: number): number {

    return id + 10299
}