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 { UploadFIle } from "@/utils/backblaze";
import { getLogger } from "@/utils/logger";
import { Prisma } from "@prisma/client";

const logger = getLogger("/api/admin/collections");

export const POST = async (req: NextRequest) => {
  // console.log("Request body backend heat POST");
  try {
    const session = await getServerSession(authOptions);

    if (!session || session.user.role !== "ADMIN") {
      logger.warn("Forbidden", { userRole: session?.user.role });
      return new NextResponse("Forbidden", { status: 403 });
    }
    
    const formData = await req.formData()

    const title = formData.get("title")
    const description = formData.get("description")
    const imagesCount = formData.get("imagesCount")



    if (!title || !description || parseInt(imagesCount as string) == 0) {
      logger.warn("Missing fields", { status: 400, title: title, description: description, imagesCount: imagesCount })
      return new NextResponse("Missing fields", { status: 400 });
    }

    /*    console.log(title)
        console.log(description)
        console.log(imagesCount)*/

    const images = []

    for (let i = 0; i < parseInt(imagesCount as string); i++) {
      const image = formData.get(`image_${i}`)
      images.push(image)
    }

    // console.log(images)


    const collection = await db.collections.create({
      data: {
        title: title.toString(),
        description: description.toString(),
      }
    })

    const collectionId = collection.id

    for (let i = 0; i < images.length; i++) {
      const imageFile = images[i] as File;
      const fileName = imageFile.name
      const fileType = imageFile.type
      const fileContent = await imageFile.arrayBuffer()

      const response = await UploadFIle(fileName, fileType, fileContent, process.env.BACKBLAZE_PUBLIC_BUCKET_ID ?? '')

      const collectionAttachment = await db.attachments.create({
        data: {
          original_name: fileName,
          file_name: response.UniqueFileName ?? '',
          file_url: response.fileUrl || '',
          file_id: response.fileId,
          file_type: fileType,
          collection_id: collectionId
        }
      })

    }

    return NextResponse.json({ msg: 'Collection created successfully!' }, { status: 200 })
  } catch (error: any) {
    if (error instanceof Prisma.PrismaClientValidationError) {
      logger.error("Prisma Validation Error ", { error: error.message });
    } else {
      logger.error("Error creating collection", { errorMsg: error.message, errorData: error.config.data });
    }
    return new NextResponse("Internal Server Error", { status: 500 });
  }
};


export const GET = async (req: NextRequest) => {
  // console.log("Request body backend heat GET");
  try {

    // Retrieve the Collections from database
    const collections = await db.collections.findMany({
      orderBy: {
        updated_on: 'desc',
      },
      select: {
        uuid: true,
        id: true,
        title: true,
        description: true,
        collection_images: {
          select: {
            uuid: true,
            file_name: true,
            file_url: true
          }
        }
      }
    })

    return NextResponse.json({ data: collections, success: true }, { status: 200 })
  } catch (error: any) {
    if (error instanceof Prisma.PrismaClientValidationError) {
      logger.error("Prisma Validation Error ", { error: error.message });
    } else {
      logger.error("Failed to fetch collections", { errorMsg: error.message, errorData: error.config.data });
    }
    return new NextResponse("Internal Server Error", { status: 500 });
  }
}