import { NextRequest, NextResponse } from "next/server";
import db from "@/lib/db";
import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/[...nextauth]/auth-options";
import { UserRole } from "@prisma/client";

import { getLogger } from "@/utils/logger";


const logger = getLogger("/api/admin/products");


export const POST = async (req: Request) => {

  try {
    const session = await getServerSession(authOptions);

    if (!session || session.user.role !== UserRole.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")


    // console.log(mainCategoryId)
    // console.log(subCategoryId)
    // console.log(subSubCategoryId)

    const productExists = await db.product.findUnique({
      where: {
        product_name: title as string
      }
    })

    if (productExists) {
      return NextResponse.json({errorMessage : "Product with this name already exists"}, { status: 400 })
    }


    const product = await db.product.create({
      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 }, { status: 200 })

  } catch (error: any) {
     logger.error("Failed to create a product", {
      error: error?.config?.data ?? error?.message ?? "Unknown error"
    });
    return new NextResponse("An error occurred from Products backend", {
      status: 500,
    });
  }
};


export const GET = async (req: NextRequest) => {

  try {

    const {searchParams} = new URL(req.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 !== UserRole.ADMIN) {
      return new NextResponse("Forbidden", { status: 403 });
    }

    const products = await db.product.findMany({
      skip: (page - 1) * limit,
      take: limit,
      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
          }
        },

        // _count: {
        //   select: {
        //     product_variants: {
        //       _sum: {

        //       }
        //     }
        //   }
        // }

      }
    })

    const totalProducts = await db.product.count()


    return NextResponse.json({ products: products, total: totalProducts, page: page, limit: limit }, { status: 200 })

  } catch (error: any) {
    logger.error("Failed to fetch products", {
      error: error?.config?.data ?? error?.message ?? "Unknown error"
    });
    return new NextResponse("An error occurred from products backend", {
      status: 500,
    });
  }
};
