import "server-only";
import { prisma } from "@/lib/prisma";
import { getVacationUsed } from "@/lib/absences/queries";
import { getYearStats } from "@/lib/time/queries";

export type PlannedAbsence = { id: string; type: string; startDate: string; endDate: string };

export type Subordinate = {
  id: string;
  name: string;
  email: string;
  jobTitle: string | null;
  avatarUrl: string | null;
  status: string;
  roleNames: string[];
  vacationUsed: number;
  vacationTotal: number;
  worktimeMonth: number;
  worktimeYear: number;
  /** Läuft gerade eine Zeiterfassung? ISO-Startzeit, sonst null. */
  clockedInSince: string | null;
  plannedAbsences: PlannedAbsence[];
};

/** Direkte Unterstellte eines/einer Vorgesetzten (read-only Einsicht). */
export async function getSubordinates(supervisorId: string): Promise<Subordinate[]> {
  const year = new Date().getFullYear();
  const users = await prisma.user.findMany({
    where: { supervisorId },
    orderBy: { name: "asc" },
    select: {
      id: true,
      name: true,
      displayName: true,
      email: true,
      jobTitle: true,
      avatarUrl: true,
      status: true,
      vacationDaysPerYear: true,
      roles: { select: { role: { select: { name: true } } } },
    },
  });

  const todayStart = new Date();
  todayStart.setHours(0, 0, 0, 0);

  return Promise.all(
    users.map(async (u) => {
      const [used, stats, planned, running] = await Promise.all([
        getVacationUsed(u.id),
        getYearStats(u.id, year),
        prisma.absenceRequest.findMany({
          where: { userId: u.id, status: "APPROVED", endDate: { gte: todayStart } },
          orderBy: { startDate: "asc" },
          select: { id: true, type: true, startDate: true, endDate: true },
        }),
        prisma.timeEntry.findFirst({
          where: { userId: u.id, status: "RUNNING" },
          orderBy: { startedAt: "desc" },
          select: { startedAt: true },
        }),
      ]);
      return {
        id: u.id,
        name: u.displayName ?? u.name,
        email: u.email,
        jobTitle: u.jobTitle,
        avatarUrl: u.avatarUrl,
        status: u.status,
        roleNames: u.roles.map((r) => r.role.name),
        vacationUsed: used,
        vacationTotal: u.vacationDaysPerYear,
        worktimeMonth: stats.month,
        worktimeYear: stats.year,
        clockedInSince: running ? running.startedAt.toISOString() : null,
        plannedAbsences: planned.map((a) => ({
          id: a.id,
          type: a.type,
          startDate: a.startDate.toISOString(),
          endDate: a.endDate.toISOString(),
        })),
      };
    }),
  );
}
