import { auth } from "@/lib/auth"
import { redirect } from "next/navigation"
import PageHeader from "@/components/app/PageHeader"
import PageShell from "@/components/app/PageShell"
import EmployeeLeavePage from "@/features/leave/components/EmployeeLeavePage"
import { ensureLeaveApprovals } from "@/lib/leave-approval"
import { db } from "@/lib/db"

export const dynamic = "force-dynamic"

export default async function MyLeavePage() {
  const session = await auth()
  if (!session) redirect("/login")

  // ── Resolve the employee record tied to this user ──────────────────────────
  const user = await db.user.findUnique({
    where: { email: session.user.email! },
    include: { employee: true },
  })

  if (!user?.employee) {
    return (
      <PageShell>
        <PageHeader
          title="My Leave"
          description="Submit and track your leave requests."
        />
        <p className="text-sm text-slate-500 mt-4">
          No employee profile is linked to your account. Please contact HR.
        </p>
      </PageShell>
    )
  }

  const employeeId = user.employee.id

  // Backfill approval rows for legacy pending requests
  const legacyPending = await db.leaveRequest.findMany({
    where: { employeeId, status: "pending", approvals: { none: {} } },
    select: { id: true },
  })
  await Promise.all(
    legacyPending.map((r) => ensureLeaveApprovals(r.id, user.id)),
  )

  // ── Parallel fetch ─────────────────────────────────────────────────────────
  const [leaveTypes, publicHolidays, myRequests, allowances] = await Promise.all([
    db.leaveType.findMany({ orderBy: { name: "asc" } }),

    db.publicHoliday.findMany({ orderBy: { date: "asc" } }),

    db.leaveRequest.findMany({
      where: { employeeId },
      include: {
        leaveType: true,
        approvals: true,
      },
      orderBy: { createdAt: "desc" },
    }),

    db.employeeLeaveAllowance.findMany({
      where: { employeeId },
      include: { leaveType: true },
    }),
  ])

  // ── Compute balance: allowance − approved requests ─────────────────────────
  const usedByType = myRequests
    .filter((r) => r.status === "approved")
    .reduce<Record<string, number>>((acc, r) => {
      acc[r.leaveTypeId] = (acc[r.leaveTypeId] ?? 0) + r.duration
      return acc
    }, {})

  const balances = allowances.map((a) => {
    const used = usedByType[a.leaveTypeId] ?? 0
    return {
      leaveTypeId:   a.leaveTypeId,
      leaveTypeName: a.leaveType.name,
      totalDays:     a.days,
      usedDays:      used,
      remainingDays: Math.max(0, a.days - used),
    }
  })

  // ── Serialize (no Date objects across the server/client boundary) ──────────
  const serializedRequests = myRequests.map((r) => ({
    id:              r.id,
    leaveTypeName:   r.leaveType.name,
    startDate:       r.startDate.toISOString().split("T")[0],
    endDate:         r.endDate.toISOString().split("T")[0],
    duration:        r.duration,
    status:          r.status as "pending" | "approved" | "rejected",
    reason:          r.reason ?? null,
    rejectionReason: r.rejectionReason ?? null,
    createdAt:       r.createdAt.toISOString(),
    approvalTotal:   r.approvals.length,
    approvalApproved: r.approvals.filter((a) => a.status === "approved").length,
  }))

  const serializedHolidays = publicHolidays.map((h) => ({
    date:    h.date.toISOString().split("T")[0],
    endDate: h.endDate ? h.endDate.toISOString().split("T")[0] : null,
  }))

  return (
    <PageShell>
      <PageHeader
        title="My Leave"
        description="Submit and track your leave requests."
      />
      <EmployeeLeavePage
        employeeId={employeeId}
        employeeName={user.employee.fullName}
        leaveTypes={leaveTypes.map((t) => ({ id: t.id, name: t.name }))}
        publicHolidays={serializedHolidays}
        myRequests={serializedRequests}
        balances={balances}
      />
    </PageShell>
  )
}