
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 { DeleteFileById, UploadFIle } from "@/utils/backblaze";
import { getLogger } from "@/utils/logger";


const logger = getLogger("/api/admin/sliders/[id]");

export const DELETE = async (req: NextRequest, { params }: { params: { id: string } }) => {
    try {
        const session = await getServerSession(authOptions);
        if (!session || session.user.role !== UserRole.ADMIN) {
            return new NextResponse("Forbidden", { status: 403 });
        }

        const sliderId = params.id;

        const attachments = await db.attachments.findMany({
            where: {
                slider_id: parseInt(sliderId as string),
            }
        })

        for (let i = 0; i < attachments.length; i++) {
            const deleteRes = await DeleteFileById(attachments[i].file_id as string, attachments[i].file_name, process.env.BACKBLAZE_PUBLIC_BUCKET_ID ?? "")

        }

        await db.attachments.deleteMany({
            where: {
                slider_id: parseInt(sliderId as string),
            }
        })

        const deleteSlider = await db.slider.delete({
            where: {
                id: parseInt(sliderId as string),
            }
        })


        return NextResponse.json({ mssg: 'Slider deleted successfully' }, { status: 200 });
    } catch (error: any) {

        logger.error(`Failed to delete a slider ${params.id}`, {
            error: error?.config?.data ?? error?.message ?? "Unknown error"
        });

        return new NextResponse("Internal Server Error", { status: 500 });
    }
}

export const GET = async (req: NextRequest, { params }: { params: { id: string } }) => {
    try {
        const session = await getServerSession(authOptions);
        if (!session || session.user.role !== UserRole.ADMIN) {
            return new NextResponse("Forbidden", { status: 403 });
        }

        const sliderId = params.id;

        const slider = await db.slider.findUnique({
            where: {
                id: parseInt(sliderId),
            },
            include: {
                attachments: true,
            }
        })

        return NextResponse.json({ slider }, { status: 200 });
    }
    catch (error: any) {
        logger.error(`Failed to fetch a slider of id ${params.id}`, {
            error: error?.config?.data ?? error?.message ?? "Unknown error"
        });
        return new NextResponse("Internal Server Error", { status: 500 });
    }
}


export const PUT = async (req: NextRequest, { params }: { params: { id: string } }) => {
    try {
        const session = await getServerSession(authOptions);
        if (!session || session.user.role !== UserRole.ADMIN) {
            return new NextResponse("Forbidden", { status: 403 });
        }
        const sliderId = params.id;

        const formData = await req.formData()
        const title = formData.get("title")
        const description = formData.get("description")
        const imagesCount = formData.get("imagesCount")

        const isActive = formData.get("is_active")

        console.log(isActive)

        const deleteImagesCount = formData.get("deleteImagesCount")
        const deleteImages = []


        for (let i = 0; i < parseInt(deleteImagesCount as string); i++) {
            const deleteImage = formData.get(`deleteImages${i}`)
            deleteImages.push(deleteImage)
        }

        console.log(deleteImages)
        console.log(deleteImagesCount)


        const fileImages = []
        for (let i = 0; i < parseInt(imagesCount as string); i++) {
            const image = formData.get(`images${i}`)
            fileImages.push(image)
        }

        const attachments = await db.attachments.findMany({
            where: {
                file_id: {
                    in: deleteImages.map((image) => image as string)
                }
            }
        })

        for (let i = 0; i < attachments.length; i++) {
            const deleteRes = await DeleteFileById(attachments[i].file_id as string, attachments[i].file_name, process.env.BACKBLAZE_PUBLIC_BUCKET_ID ?? "")
        }
        await db.attachments.deleteMany({
            where: {
                file_id: {
                    in: deleteImages.map((image) => image as string)
                }
            }
        })
        const images2 = []
        for (let i = 0; i < fileImages.length; i++) {
            const image = fileImages[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
            images2.push({
                imageUrl: imageUrl,
                fileId: fileId,
                fileName: fileName,
                fileType: fileType,
                fileContent: fileContent,
                uniqueFileName: response.UniqueFileName,
            })
        }

        if (isActive == 'true') {
            await db.slider.updateMany({
                data: {
                    is_active: false,
                },
            });
        }

        const slider = await db.slider.update({
            where: {
                id: parseInt(sliderId),
            },
            data: {
                title: title?.toString() || "",
                description: description?.toString() || "",
                is_active: isActive === "true" ? true : false,
                attachments: {
                    create: images2.map((image) => ({
                        original_name: image.fileName,
                        file_name: image.uniqueFileName ?? "",
                        file_url: image.imageUrl ?? "",
                        file_id: image.fileId ?? "",
                        file_type: image.fileType,
                    }))
                },
            },
            include: {
                attachments: true,
            }
        })
        return NextResponse.json({ slider }, { status: 200 });

    } catch (error: any) {
        logger.error(`Failed to update a slider of id ${params.id}`, {
            error: error?.config?.data ?? error?.message ?? "Unknown error"
        });
        return new NextResponse("Internal Server Error", { status: 500 });
    }

}


