import { NextRequest } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "../../auth/authOptions";
import { prisma } from "@/lib/prisma";
import { FolderSchema } from "@/lib/validations/schemas";
import { successResponse, errorResponse, unauthorizedResponse, validationErrorResponse } from "@/lib/api-response";
import { z } from "zod";

// GET : Récupérer un dossier par ID
export async function GET(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const session = await getServerSession(authOptions);
    if (!session) {
        return unauthorizedResponse();
    }
  
    const resolvedParams = await params;
    const id = parseInt(resolvedParams.id);
    if (isNaN(id)) {
      return errorResponse("ID invalide", undefined, 400);
    }

    const folder = await prisma.folder.findUnique({
      where: { id },
      include: { client: true },
    });

    if (!folder) {
      return errorResponse("Dossier non trouvé", undefined, 404);
    }

    return successResponse(folder);
  } catch (error: any) {
    return errorResponse("Erreur lors de la récupération du dossier", error.message);
  }
}

// PUT : Modifier un dossier
export async function PUT(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const session = await getServerSession(authOptions);
    if (!session || (session.user.role !== "MANAGER" && session.user.role !== "ADMIN")) {
        return unauthorizedResponse();
    }
    
    const resolvedParams = await params;
    const id = parseInt(resolvedParams.id);
    
    if (isNaN(id)) {
      return errorResponse("ID invalide", undefined, 400);
    }

    const rawData = await request.json();
    
    try {
        FolderSchema.parse(rawData);
    } catch (validationError: any) {
        if (validationError instanceof z.ZodError) {
            return validationErrorResponse(validationError);
        }
    }

    const folder = await prisma.folder.update({
      where: { id },
      data: rawData,
    });

    return successResponse(folder);
  } catch (error: any) {
    return errorResponse("Erreur lors de la modification", error.message);
  }
}

// DELETE : Supprimer un dossier
export async function DELETE(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const session = await getServerSession(authOptions);
    if (!session || (session.user.role !== "MANAGER" && session.user.role !== "ADMIN")) {
        return unauthorizedResponse();
    }
    
    const resolvedParams = await params;
    const id = parseInt(resolvedParams.id);
    if (isNaN(id)) {
      return errorResponse("ID invalide", undefined, 400);
    }

    await prisma.folder.delete({
      where: { id },
    });

    return successResponse({ message: "Dossier supprimé" });
  } catch (error: any) {
    return errorResponse("Erreur lors de la suppression", error.message);
  }
}
