import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/[...nextauth]/auth-options";
import db from "@/lib/db";

import { getLogger } from "@/utils/logger";


const logger = getLogger("/api/admin/products/[productId]");

export const GET = async (
  req: NextRequest,
  { params }: { params: { productsId: string } }
) => {
  try {
    const product = await db.product.findUnique({
      where: {
        id: parseInt(params.productsId),
      },
      select: {
        id: true,
        product_name: true,
        description: true,

        collection: true,
        tags: true,
        category: {
          select: {
            id: true,
            name: true
          }
        },
        sub_category: {
          select: {
            id: true,
            name: true
          }
        },
        sub_sub_category: {
          select: {
            id: true,
            name: true
          }
        },
        brand: true,
      }
    })

    return NextResponse.json({ msg: product }, { status: 200 })

  } catch (error: any) {
    logger.error(`Failed to fetch a product of id ${params.productsId}`, {
      error: error?.config?.data ?? error?.message ?? "Unknown error"
    });
    return new NextResponse("Internal server Error", { status: 500 });
  }
};

export const DELETE = async (
  req: NextRequest,
  { params }: { params: { productsId: string } }
) => {
  try {
    const session = await getServerSession(authOptions)

    if (!session || session.user.role !== "ADMIN") {
      return new NextResponse("Forbidden", { status: 403 })
    }

    const product = await db.product.findUnique({
      where: {
        id: parseInt(params.productsId),
      },
      // include: {
      //   product_images: true,
      // }
    })

    if (!product) {
      return new NextResponse("Product not found", { status: 404 })
    }


    const deleteProduct = await db.product.delete({
      where: {
        id: parseInt(params.productsId),
      }
    })

    return NextResponse.json({ msg: 'Product deleted successfully' }, { status: 200 })

  } catch (error: any) {
    logger.error(`Failed to delete a product of id ${params.productsId}`, {
      error: error?.config?.data ?? error?.message ?? "Unknown error"
    }); return new NextResponse("Internal server Error", { status: 500 })
  }
};


export const PUT = async (
  req: NextRequest,
  { params }: { params: { productsId: string } }
) => {
  try {
    const session = await getServerSession(authOptions)

    if (!session || session.user.role !== "ADMIN") {
      return new NextResponse("Forbidden", { status: 403 })
    }

    const formData = await req.formData()


    const title = formData.get("title")
    const description = formData.get("description")
    const mainCategory = formData.get("category")
    const subCategory = formData.get("subCategory")
    const subSubCategory = formData.get("subSubCategory")

    const tags = formData.get("tags")
    const collectionId = formData.get("collectionId")
    const brand = formData.get("brand")
    // const sizes = formData.get("sizes")

    const mainCategoryId = formData.get("mainCategoryId")
    const subCategoryId = formData.get("subCategoryId")
    const subSubCategoryId = formData.get("subSubCategoryId")


    const product = await db.product.update({
      where: {
        id: parseInt(params.productsId),
      },
      data: {
        product_name: title as string,
        description: description as string,
        category: { connect: { id: parseInt(mainCategoryId as string) } },
        sub_category: subCategory ? { connect: { id: parseInt(subCategoryId as string) } } : undefined,
        sub_sub_category: subSubCategory ? { connect: { id: parseInt(subSubCategoryId as string) } } : undefined,

        collection: collectionId ? { connect: { id: parseInt(collectionId.toString()) } } : undefined,
        tags: JSON.parse(tags as string),
        brand: brand as string,


      }
    })

    return NextResponse.json({ msg: 'Product updated successfully' }, { status: 200 })


  } catch (error: any) {
    logger.error(`Failed to update a product of id ${params.productsId}`, {
      error: error?.config?.data ?? error?.message ?? "Unknown error"
    });
    return new NextResponse("Internal server Error", { status: 500 })
  }
}