import { NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import prisma from "@/lib/prisma";

export async function GET(req: Request) {
  try {
    const session = await getServerSession(authOptions);
    if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

    const { searchParams } = new URL(req.url);
    const start = searchParams.get("start");
    const end = searchParams.get("end");

    let where: any = {
      status: { in: ["APPROVED", "PENDING"] },
    };

    if (start && end) {
      where.OR = [
        {
          startDate: { gte: new Date(start), lte: new Date(end) },
        },
        {
          endDate: { gte: new Date(start), lte: new Date(end) },
        },
        {
          startDate: { lte: new Date(start) },
          endDate: { gte: new Date(end) },
        },
      ];
    }

    // For employees, show their own + approved team leaves
    if (session.user.role === "EMPLOYEE") {
      const user = await prisma.user.findUnique({
        where: { id: session.user.id },
        select: { managerId: true },
      });

      if (user?.managerId) {
        const teammates = await prisma.user.findMany({
          where: { managerId: user.managerId },
          select: { id: true },
        });
        where.OR = undefined;
        where.AND = [
          {
            OR: [
              { userId: session.user.id },
              {
                userId: { in: teammates.map((t) => t.id) },
                status: "APPROVED",
              },
            ],
          },
        ];
        if (start && end) {
          where.AND.push({
            OR: [
              { startDate: { gte: new Date(start), lte: new Date(end) } },
              { endDate: { gte: new Date(start), lte: new Date(end) } },
              { startDate: { lte: new Date(start) }, endDate: { gte: new Date(end) } },
            ],
          });
        }
      } else {
        where.userId = session.user.id;
      }
    }

    const leaves = await prisma.leaveRequest.findMany({
      where,
      include: {
        user: { select: { name: true, department: true } },
        leaveType: true,
      },
    });

    const events = leaves.map((leave) => ({
      id: leave.id,
      title: `${leave.user.name} - ${leave.leaveType.name}`,
      start: leave.startDate.toISOString().split("T")[0],
      end: new Date(new Date(leave.endDate).getTime() + 86400000).toISOString().split("T")[0],
      backgroundColor: leave.status === "PENDING" ? "#FCD34D" : leave.leaveType.color,
      borderColor: leave.status === "PENDING" ? "#F59E0B" : leave.leaveType.color,
      extendedProps: {
        status: leave.status,
        department: leave.user.department,
        leaveType: leave.leaveType.name,
        userName: leave.user.name,
      },
    }));

    return NextResponse.json(events);
  } catch (error) {
    console.error("Calendar error:", error);
    return NextResponse.json({ error: "Failed to fetch calendar data" }, { status: 500 });
  }
}
