import { NextRequest, NextResponse } from "next/server";
import { writeFile } from "fs/promises";
import { join } from "path";
import prisma from "@/lib/db";
import { getSession } from "@/lib/auth";

export async function POST(req: NextRequest) {
    const session = await getSession();
    if (!session) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });

    try {
        const formData = await req.formData();
        const file = formData.get("file") as File;

        if (!file) {
            return NextResponse.json({ error: "Aucun fichier fourni" }, { status: 400 });
        }

        const bytes = await file.arrayBuffer();
        const rawBuffer = Buffer.from(bytes);
        let buffer: any = rawBuffer;

        // Optimization for images
        let finalFileName = file.name;
        if (file.type.startsWith("image/")) {
            const sharp = (await import("sharp")).default;
            const optimizedBuffer = await sharp(rawBuffer as any)
                .resize(1200, null, { withoutEnlargement: true })
                .webp({ quality: 80 })
                .toBuffer();
            buffer = Buffer.from(optimizedBuffer) as any;
            finalFileName = file.name.split(".")[0] + ".webp";
        }

        // Sanitize name and add timestamp to avoid collisions
        const timestamp = Date.now();
        const safeName = finalFileName.replace(/[^a-z0-9.]/gi, "_").toLowerCase();
        const fileName = `${timestamp}_${safeName}`;

        const uploadsDir = join(process.cwd(), "public", "uploads");
        const path = join(uploadsDir, fileName);

        await writeFile(path, buffer);

        const url = `/uploads/${fileName}`;

        // Save to Media model
        const media = await prisma.media.create({
            data: {
                url,
                name: file.name,
                type: file.type,
                size: file.size,
            }
        });

        return NextResponse.json(media);
    } catch (e) {
        console.error(e);
        return NextResponse.json({ error: "Erreur lors de l'upload" }, { status: 500 });
    }
}
