"use client"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { cn } from "@/lib/utils"; interface CourtOccupancy { courtId: string; courtName: string; availableHours: number; bookedHours: number; occupancyPercent: number; } interface OccupancyChartProps { data: CourtOccupancy[]; isLoading?: boolean; } export function OccupancyChart({ data, isLoading = false }: OccupancyChartProps) { if (isLoading) { return ; } if (data.length === 0) { return ( Court Occupancy

No courts configured

); } // Calculate overall occupancy const totalAvailable = data.reduce((sum, c) => sum + c.availableHours, 0); const totalBooked = data.reduce((sum, c) => sum + c.bookedHours, 0); const overallOccupancy = totalAvailable > 0 ? Math.round((totalBooked / totalAvailable) * 100) : 0; return (
Court Occupancy
= 80 ? "text-green-600" : overallOccupancy >= 50 ? "text-blue-600" : "text-primary-600" )} > {overallOccupancy}% total
{data.map((court) => (
{court.courtName} {court.bookedHours}h / {court.availableHours}h
{/* Available bar (background) */}
{/* Booked bar */}
= 80 ? "bg-blue-500" : court.occupancyPercent >= 50 ? "bg-blue-400" : "bg-blue-300" )} style={{ width: `${court.occupancyPercent}%` }} >
= 80 ? "text-blue-600" : court.occupancyPercent >= 50 ? "text-blue-500" : "text-primary-500" )} > {court.occupancyPercent}% booked {court.availableHours - court.bookedHours}h available
))}
{/* Legend */}
Booked
Available
); } // Loading skeleton export function OccupancyChartSkeleton() { return (
{[1, 2, 3].map((i) => (
))}
); }