
import { NextRequest, NextResponse } from "next/server";
import { authOptions } from "@/app/api/auth/[...nextauth]/auth-options";
import { getServerSession } from "next-auth";
import { db } from "@/lib/db";
import {Prisma} from "@prisma/client";
import {getLogger} from "@/utils/logger";

const logger = getLogger("/api/admin/deliveryCost");



export const POST = async (req: NextRequest) => {
  try {
    const session = await getServerSession(authOptions);
    if (!session || session.user.role !== "ADMIN") {
      logger.warn("Forbidden", { status: 403, session: session, userRole: session?.user.role });
      return new NextResponse("Forbidden", { status: 403 });
    }

    const data = await req.formData();

    const city = data.get("city");
    const district = data.get("district");
    const division = data.get("division");
    const post_code = data.get("post_code");
    const shipping_zone = data.get('shipping_zone')
    const courier_company_name = data.get('courier_company_name')
    const delivery_cost = data.get('delivery_cost')
    const per_kg_cost = data.get('per_kg_cost')

    const deliveryCost = await db.deliveryCost.create({

        data: {
            city: city?.toString() ?? "",
            district: district?.toString() ?? "",
            division: division?.toString() ?? "",
            post_code: post_code?.toString() ?? "",
            shipping_zone: shipping_zone?.toString() ?? "",
            courier_company_name: courier_company_name?.toString(),
            per_kg_cost: per_kg_cost ? parseFloat(per_kg_cost as string) : 0,
            delivery_cost: delivery_cost ? parseFloat(delivery_cost as string) : 0 
        }
    })
    // console.log("Parent", parent);

 

    return NextResponse.json({ deliveryCost }, { status: 200 });
  } catch (error: any) {
    if (error instanceof Prisma.PrismaClientValidationError) {
      logger.error("Prisma Validation Error ", { error: error.message});
    } else {
      logger.error("Error creating delivery cost data", { errorMsg: error.message, errorData: error.config.data });
    }
    return new NextResponse("Internal server Error", { status: 500 });
  }
};


export const GET = async (request: NextRequest) => {
    try {
    
      const {searchParams} = new URL(request.url)
      const page = parseInt(searchParams.get("page") || "1")
      const limit = parseInt(searchParams.get("limit") || "10")

    // const session = await getServerSession(authOptions);
    
    // if (!session || session.user.role !== "ADMIN") {
    //   return new NextResponse("Forbidden", { status: 403 });
    // }

    const deliveryCosts = await db.deliveryCost.findMany({
        take: limit,
        skip: (page - 1) * limit,
        orderBy: {
            id: 'desc'
        }
    })

    const totalCount = await db.deliveryCost.count({})

    return NextResponse.json({deliveryCosts: deliveryCosts, page: page, limit: limit, total: totalCount}, {status: 200})

    }
    catch(error: any){
        if (error instanceof Prisma.PrismaClientValidationError) {
            logger.error("Prisma Validation Error ", { error: error.message});
        } else {
            logger.error("Error fetching delivery cost data", { errorMsg: error.message, errorData: error.config.data });
        }
        return new NextResponse("Internal server Error", { status: 500 });
    }
}