import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/authOptions";
import { prisma } from "@/lib/prisma";

export async function GET(req: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user || session.user.role !== "ADMIN") {
      return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
    }

    const managers = await prisma.user.findMany({
      where: { role: "MANAGER" },
      select: {
        id: true,
        firstName: true,
        lastName: true,
        email: true,
        phone: true,
        createdAt: true
      }
    });

    const managersWithStats = await Promise.all(
      managers.map(async (manager) => {
        // Récupérer le ManagerData du manager
        const managerData = await prisma.managerData.findUnique({
          where: { userId: manager.id }
        });

        // Compter les clients de ce manager
        const clientsCount = await prisma.client.count({
          where: { managerId: manager.id }
        });

        // Compter les tâches par statut
        const tasksStats = await prisma.task.groupBy({
          by: ['status'],
          where: { managerDataId: managerData?.id },
          _count: true
        });

        const tasksInProgress = tasksStats.find(s => s.status === 'IN_PROGRESS')?._count || 0;
        const tasksCompleted = tasksStats.find(s => s.status === 'COMPLETED')?._count || 0;
        const tasksOverdue = tasksStats.find(s => s.status === 'OVERDUE')?._count || 0;

        // Compter les factures de ce manager
        const invoicesCount = await prisma.invoice.count({
          where: { managerDataId: managerData?.id }
        });

        // Compter les partenaires des clients de ce manager
        const partnersCount = await prisma.partner.count({
          where: {
            client: {
              managerId: manager.id
            }
          }
        });

        return {
          id: manager.id,
          firstName: manager.firstName,
          lastName: manager.lastName,
          email: manager.email,
          phone: manager.phone,
          createdAt: manager.createdAt,
          clientsCount,
          tasksInProgress,
          tasksCompleted,
          tasksOverdue,
          invoicesCount,
          partnersCount
        };
      })
    );

    return NextResponse.json(managersWithStats);
  } catch (error) {
    console.error('Erreur lors de la récupération des stats des managers:', error);
    return NextResponse.json(
      { error: "Erreur lors de la récupération des données" },
      { status: 500 }
    );
  }
} 