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 {CategoryType, Prisma, UserRole} from "@prisma/client";
import {getLogger} from "@/utils/logger";

const logger = getLogger("/api/admin/categories");

export async function POST(req: NextRequest) {

  try {

    const body = await req.formData();
    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 name = body.get("name");
    const description = body.get("description"); 
    const category_type = body.get("category_type");
    const parent = body.get("parent");
    const specifications = body.get("specifications")

    

    const category = await db.categories.create({
      data: {
        name: name? name.toString() : "",
        description: description? description.toString() : "",
        category_type: category_type as CategoryType,
        filters: specifications ? specifications.toString() : "",
        // parent: parent? { connect: { id: parseInt(parent.toString()) } } : undefined
        parent_id: parent ? parseInt(parent.toString()) : null
      }
    })


    console.log(category)

    return NextResponse.json( {category}, { status: 200 });
  } catch (error:any) {
    if (error instanceof Prisma.PrismaClientValidationError) {
      logger.error("Prisma Validation Error ", { error: error.message});
    } else {
      logger.error("Failed to create category", { errorMsg: error.message, errorData: error.config.data });
    }

    return NextResponse.json(
      { error: "Internal Server Error" },
      { status: 500 }
    );
  }
}

export async function GET(req: NextRequest){

  try {
    const categories = await db.categories.findMany({
      // where: {
      //   category_type: 'MAIN_CATEGORY'
      // },
      orderBy: {
        updated_on: 'desc',
      },
      select: {
        id: true,
        uuid: true,
        name: true,
        description: true,
        category_type: true,
        parent: {
          select: {
            id: true,
            uuid: true,
            name: true,
            category_type: true,
            description: true,
            children: true
          }
        },
        children: {
          select: {
            id: true,
            uuid: true,
            name: true,
            category_type: true,
            description: true,
            children: true

          }
        }
      }
    })

    // console.log(categories)

    return NextResponse.json({data: categories}, {status: 200})
  } catch (error:any) {
    logger.error("Failed to fetch category data", { error: error.config.data });
    return new NextResponse("Internal server Error", { status: 500 });
  }
}
