import { NextRequest, NextResponse } from "next/server";
import { createCategoriesSchema } from "@/lib/zodSchemas";
import { authOptions } from "@/app/api/auth/[...nextauth]/auth-options";
import { getServerSession } from "next-auth";
import db from "@/lib/db";
import { CategoryType, Prisma, UserRole } from "@prisma/client";
import { getLogger } from "@/utils/logger";

const logger = getLogger("/api/admin/orders/[uuid]");

export async function GET(req: NextRequest, { params }: { params: { uuid: string } }) {
    try {


        const session = await getServerSession(authOptions);

        if (!session || session.user.role !== UserRole.ADMIN) {
            logger.warn("Forbidden", { userRole: session?.user.role });
            return new NextResponse("Forbidden", { status: 403 });
        }

        const order = await db.orders.findUnique({
            where: {
                uuid: params.uuid
            },
            include: {
                applied_coupon: true,
                shipment_details: true,
                order_items: {
                    include: {
                        variant: {
                            include: {
                                variant_images: true
                            }
                        }
                    }
                },
                address: {
                    include: {
                        shipping_zone: true
                    }
                },
                payment: true,

            }
        })

        return NextResponse.json({ order }, { status: 200 })

    }
    catch (error: any) {
        if (error instanceof Prisma.PrismaClientValidationError) {
            logger.error("Prisma Validation Error ", { error: error.message });
        } else {
            logger.error("Failed to fetch order details", { errorMsg: error.message, errorData: error.config.data });
        }

        return NextResponse.json(
            { error: "Internal Server Error" },
            { status: 500 }
        );
    }
}


export async function PUT(req: NextRequest, { params }: { params: { uuid: string } }) {
    try {

        const session = await getServerSession(authOptions);
        if (!session || session.user.role !== UserRole.ADMIN) {
            logger.warn("Forbidden", { userRole: session?.user.role });
            return new NextResponse("Forbidden", { status: 403 });
        }

        const body = await req.json();

        // console.log(body)

        const { orderStatus, name } = body

        const order = await db.orders.update({
            where: {
                uuid: params.uuid
            },
            data: {
                order_status: orderStatus,
                shipment_details: {
                    update: {
                        name: name,
                        is_delivered: orderStatus === "DELIVERED",
                    }
                }
            },
            include: {
                shipment_details: true,
            }
        })

        console.log(order)

        return NextResponse.json({ order }, { status: 200 })

    }
    catch (error: any) {
        logger.error("Failed update order data", { error: error.config.data });
        return new NextResponse("Internal server Error", { status: 500 });
    }

}