import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { getAdminUser } from "@/lib/auth";
import { parseDateUTC } from "@/lib/timeslot-utils";

export async function GET() {
  const admin = await getAdminUser();
  if (!admin) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const todayKey = new Date().toISOString().slice(0, 10);
  const today = parseDateUTC(todayKey);

  const [
    totalStudents,
    activeStudents,
    totalEvents,
    activeEvents,
    totalEnquiries,
    pendingEnquiries,
    totalChangeRequests,
    pendingChangeRequests,
    todaysBookings,
    recentEnquiries,
    recentChangeRequests,
  ] = await Promise.all([
    prisma.students.count(),
    prisma.students.count({ where: { status: "active" } }),
    prisma.master_events.count({ where: { delete_status: false } }),
    prisma.master_events.count({ where: { delete_status: false, active_status: true } }),
    prisma.contact_enquiries.count(),
    prisma.contact_enquiries.count({ where: { status: "Pending" } }),
    prisma.schedule_change_requests.count(),
    prisma.schedule_change_requests.count({ where: { status: "pending" } }),
    prisma.schedule_bookings.findMany({
      where: { booking_date: today, status: "active" },
      include: {
        time_slots: { select: { start_time: true, end_time: true } },
        student_schedules: { include: { students: { select: { name: true, student_id: true } } } },
      },
      orderBy: { time_slots: { start_time: "asc" } },
    }),
    prisma.contact_enquiries.findMany({
      orderBy: { created_at: "desc" },
      take: 5,
      select: { id: true, name: true, email: true, subject: true, status: true, created_at: true },
    }),
    prisma.schedule_change_requests.findMany({
      where: { status: "pending" },
      orderBy: { created_at: "desc" },
      take: 5,
      include: { students: { select: { name: true, student_id: true } } },
    }),
  ]);

  return NextResponse.json({
    data: {
      stats: {
        totalStudents,
        activeStudents,
        totalEvents,
        activeEvents,
        totalEnquiries,
        pendingEnquiries,
        totalChangeRequests,
        pendingChangeRequests,
        todaysClassCount: todaysBookings.length,
      },
      todaysClasses: todaysBookings.map((b) => ({
        id: b.id,
        start_time: b.time_slots.start_time,
        end_time: b.time_slots.end_time,
        student_name: b.student_schedules.students.name,
        student_id: b.student_schedules.students.student_id,
      })),
      recentEnquiries: recentEnquiries.map((e) => ({
        ...e,
        id: e.id.toString(), // BigInt -> string
      })),
      recentChangeRequests: recentChangeRequests.map((r) => ({
        id: r.id,
        student_name: r.students.name,
        student_id: r.students.student_id,
        requested_date: r.requested_date.toISOString().slice(0, 10),
        requested_start_time: r.requested_start_time,
        requested_end_time: r.requested_end_time,
        created_at: r.created_at,
      })),
    },
  });
}