import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/[...nextauth]/auth-options";
import { UserRole } from "@prisma/client";
import { NextRequest, NextResponse } from "next/server";
import db from "@/lib/db";
import { UploadFIle } from "@/utils/backblaze";
import { getLogger } from "@/utils/logger";


const logger = getLogger("/api/admin/sliders");


export const POST = async (req: NextRequest) => {

    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 is_active = formData.get("is_active") === "true" ? true : false

        const imagesCount = formData.get("imagesCount")


        const imageFiles = []
        for (let i = 0; i < parseInt(imagesCount as string); i++) {
            const imageFile = formData.get(`images${i}`)
            imageFiles.push(imageFile)
        }

        console.log(imagesCount)
        console.log(title)
        console.log(description)
        console.log(is_active)
        console.log(imageFiles)

        const images = []

        for (let i = 0; i < imageFiles.length; i++) {
            const image = imageFiles[i] as File
            const fileName = image.name
            const fileType = image.type
            const fileContent = await image.arrayBuffer()
            const response = await UploadFIle(fileName, fileType, fileContent, process.env.BACKBLAZE_PUBLIC_BUCKET_ID ?? "")
            const imageUrl = response.fileUrl
            const fileId = response.fileId
            images.push({
                imageUrl: imageUrl,
                fileId: fileId,
                fileName: fileName,
                fileType: fileType,
                fileContent: fileContent,
                uniqueFileName: response.UniqueFileName,
            })

        }


        if (is_active) {
            const sliderExists = await db.slider.findFirst({})

            if (sliderExists) {
                await db.slider.updateMany({
                    data: [
                        { is_active: false }
                    ]
                })
            }
        }

        const slider = await db.slider.create({
            data: {
                title: title as string,
                description: description as string,
                is_active: is_active,
                attachments: {
                    create: images.map((image) => ({

                        original_name: image.fileName,
                        file_name: image.uniqueFileName ?? "",
                        file_url: image.imageUrl ?? "",
                        file_id: image.fileId ?? "",
                        file_type: image.fileType,
                    }))
                }
            }
        })

        return NextResponse.json({ message: "Slider created successfully" }, { status: 200 });

    }
    catch (error: any) {
        logger.error("Error in creating slider", { error: error.message });
        return new NextResponse("Internal Server Error", { status: 500 });
    }

}


export const GET = async (req: NextRequest) => {
    try {
        const session = await getServerSession(authOptions);
        if (!session || session.user.role !== UserRole.ADMIN) {
            return new NextResponse("Forbidden", { status: 403 });
        }
        const sliders = await db.slider.findMany({
            orderBy: {
                created_on: "desc"
            },
            include: {
                attachments: true,
            }
        });
        return NextResponse.json(sliders, { status: 200 });

    } catch (error: any) {
        logger.error("Error fetching sliders", { error: error.message });
        return new NextResponse("Internal Server Error", { status: 500 });
    }
}