import prismadb from "@/lib/prismadb";
import { auth } from '@clerk/nextjs/server'
import { NextResponse } from "next/server";

// GET a single transaction by ID
export async function GET(req: Request, { params }: { params: { transactionId: string } }) {
    try {
        if (!params.transactionId) {
            return new NextResponse("Transaction ID is required", { status: 400 });
        }

        const transaction = await prismadb.transaction.findUnique({
            where: {
                id: params.transactionId,
            },
            include: {
                user: true,
                transactionitem: true,
            },
        });

        if (!transaction) {
            return new NextResponse("Transaction not found", { status: 404 });
        }

        return NextResponse.json(transaction);
    } catch (error) {
        console.error('[TRANSACTION_GET]', error);
        return new NextResponse("Internal error", { status: 500 });
    }
}

// PATCH (update) a transaction by ID
export async function PATCH(req: Request, { params }: { params: { storeId: string, transactionId: string } }) {
    try {
        const { userId } = auth();
        const body = await req.json();

        const {
            customer_name,
            customer_email,
            total,
            transaction_method,
            userId: selectedUserId,
            itemId,
            itemName,
            price,
            quantity,
        } = body;

        if (!userId) {
            return new NextResponse("Unauthenticated", { status: 401 });
        }

        if (!params.storeId) {
            return new NextResponse("Store ID is required", { status: 400 });
        }

        if (!params.transactionId) {
            return new NextResponse("Transaction ID is required", { status: 400 });
        }

        const storeByUserId = await prismadb.store.findFirst({
            where: {
                id: params.storeId,
                userId,
            },
        });

        if (!storeByUserId) {
            return new NextResponse("Unauthorized", { status: 403 });
        }

        const updateData: any = {
            customer_name,
            customer_email,
            total: parseFloat(total),
            transaction_method,
            userId: selectedUserId,
            transactionitem: {
                upsert: [{
                    where: { id: itemId },
                    create: {
                        name: itemName,
                        price: parseFloat(price),
                        quantity: parseInt(quantity),
                    },
                    update: {
                        name: itemName,
                        price: parseFloat(price),
                        quantity: parseInt(quantity),
                    },
                }],
            },
        };

        const updatedTransaction = await prismadb.transaction.update({
            where: {
                id: params.transactionId,
            },
            data: updateData,
        });

        return NextResponse.json(updatedTransaction);
    } catch (error) {
        console.error('[TRANSACTION_PATCH]', error);
        return new NextResponse("Internal error", { status: 500 });
    }
}

// DELETE a transaction by ID
export async function DELETE(req: Request, { params }: { params: { storeId: string, transactionId: string } }) {
    try {
        const { userId } = auth();

        if (!userId) {
            return new NextResponse("Unauthenticated", { status: 401 });
        }

        if (!params.transactionId) {
            return new NextResponse("Transaction ID is required", { status: 400 });
        }

        const storeByUserId = await prismadb.store.findFirst({
            where: {
                id: params.storeId,
                userId,
            },
        });

        if (!storeByUserId) {
            return new NextResponse("Unauthorized", { status: 403 });
        }

        const deletedTransaction = await prismadb.transaction.delete({
            where: {
                id: params.transactionId,
            },
        });

        return NextResponse.json(deletedTransaction);
    } catch (error) {
        console.error('[TRANSACTION_DELETE]', error);
        return new NextResponse("Internal error", { status: 500 });
    }
}
