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";

export async function GET(req: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    if (!session) {
      return unauthorizedResponse();
    }
    
    if (session.user.role === "ADMIN") {
      const folders = await prisma.folder.findMany();
      return successResponse(folders);
    }
    
    const managerData = await prisma.managerData.findUnique({
      where: { userId: Number(session.user.id) }
    });
    
    if (!managerData) {
      return successResponse([]);
    }
    
    const folders = await prisma.folder.findMany({
      where: { managerDataId: managerData.id }
    });
    
    return successResponse(folders);
  } catch (error: any) {
    return errorResponse("Erreur lors de la récupération des dossiers", error.message);
  }
}

export async function POST(req: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    
    if (!session || (session.user.role !== "MANAGER" && session.user.role !== "ADMIN")) {
      return unauthorizedResponse();
    }
    
    let managerDataId: number | null = null;
    
    if (session.user.role === "ADMIN") {
      const defaultManager = await prisma.managerData.findFirst();
      if (!defaultManager) {
        return errorResponse("Aucun manager disponible", undefined, 400);
      }
      managerDataId = defaultManager.id;
    } else {
      const managerData = await prisma.managerData.findUnique({
        where: { userId: Number(session.user.id) }
      });
      
      if (!managerData) {
        return errorResponse("Espace manager introuvable", undefined, 400);
      }
      managerDataId = managerData.id;
    }
    
    const rawData = await req.json();
    
    try {
      FolderSchema.parse(rawData);
    } catch (validationError: any) {
      if (validationError instanceof z.ZodError) {
        return validationErrorResponse(validationError);
      }
    }
    
    const folder = await prisma.folder.create({
      data: {
        ...rawData,
        managerDataId: managerDataId
      }
    });
    
    return successResponse(folder, 201);
  } catch (error: any) {
    return errorResponse("Erreur lors de la création du dossier", error.message);
  }
}
