import { NextResponse } from "next/server";
import { auth } from "@/lib/auth";
import { prisma } from "@/lib/prisma";
import { Role } from "@/prisma/generated/prisma/client";

export async function GET() {
  try {
    const session = await auth();
    if (!session?.user?.id) {
      return NextResponse.json({ error: "Non authentifié" }, { status: 401 });
    }

    if (session.user.role !== Role.ADMIN) {
      return NextResponse.json({ error: "Accès refusé" }, { status: 403 });
    }

    // Récupérer tous les feedbacks avec les détails de l'événement et de l'utilisateur
    const feedbacks = await prisma.eventFeedback.findMany({
      include: {
        event: {
          select: {
            id: true,
            name: true,
            date: true,
            type: true,
          },
        },
        user: {
          select: {
            id: true,
            username: true,
            email: true,
          },
        },
      },
      orderBy: {
        createdAt: "desc",
      },
    });

    // Calculer les statistiques par événement
    const eventStats = await prisma.eventFeedback.groupBy({
      by: ["eventId"],
      _avg: {
        rating: true,
      },
      _count: {
        id: true,
      },
    });

    // Récupérer les détails des événements pour les stats
    const eventIds = eventStats.map((stat) => stat.eventId);
    const events = await prisma.event.findMany({
      where: {
        id: {
          in: eventIds,
        },
      },
      select: {
        id: true,
        name: true,
        date: true,
        type: true,
      },
    });

    // Combiner les stats avec les détails des événements
    const statsWithDetails = eventStats.map((stat) => {
      const event = events.find((e) => e.id === stat.eventId);
      return {
        eventId: stat.eventId,
        eventName: event?.name || "Événement supprimé",
        eventDate: event?.date || null,
        eventType: event?.type || null,
        averageRating: stat._avg.rating || 0,
        feedbackCount: stat._count.id,
      };
    });

    return NextResponse.json({
      feedbacks,
      statistics: statsWithDetails,
    });
  } catch (error) {
    console.error("Error fetching feedbacks:", error);
    return NextResponse.json(
      { error: "Erreur lors de la récupération des feedbacks" },
      { status: 500 }
    );
  }
}
