'use client'; import React, { useState } from 'react'; import { useRouter } from 'next/navigation'; import { routes } from '@/lib/routing/RouteConfig'; import { Box } from '@/ui/Box'; import { Text } from '@/ui/Text'; import { Stack } from '@/ui/Stack'; import { Button } from '@/ui/Button'; import { Icon } from '@/ui/Icon'; import { Badge } from '@/ui/Badge'; import { Group } from '@/ui/Group'; import { Surface } from '@/ui/Surface'; import { ChevronDown, ChevronUp, Calendar, CheckCircle, Trophy, Edit, Clock } from 'lucide-react'; import { DateDisplay } from '@/lib/display-objects/DateDisplay'; interface RaceEvent { id: string; name: string; track?: string; car?: string; sessionType?: string; scheduledAt: string; status: 'scheduled' | 'completed'; strengthOfField?: number; isUserRegistered?: boolean; canRegister?: boolean; canEdit?: boolean; canReschedule?: boolean; } interface EnhancedLeagueSchedulePanelProps { events: RaceEvent[]; leagueId: string; currentDriverId?: string; isAdmin: boolean; onRegister: (raceId: string) => void; onWithdraw: (raceId: string) => void; onEdit: (raceId: string) => void; onReschedule: (raceId: string) => void; onRaceDetail: (raceId: string) => void; onResultsClick: (raceId: string) => void; } interface MonthGroup { month: string; year: number; races: RaceEvent[]; } export function EnhancedLeagueSchedulePanel({ events, leagueId, currentDriverId, isAdmin, onRegister, onWithdraw, onEdit, onReschedule, onRaceDetail, onResultsClick, }: EnhancedLeagueSchedulePanelProps) { const router = useRouter(); const [expandedMonths, setExpandedMonths] = useState>(new Set()); // Group races by month const groupRacesByMonth = (): MonthGroup[] => { const groups = new Map(); events.forEach(event => { const date = new Date(event.scheduledAt); const monthKey = `${date.getFullYear()}-${date.getMonth()}`; const monthName = date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' }); if (!groups.has(monthKey)) { groups.set(monthKey, { month: monthName, year: date.getFullYear(), races: [], }); } groups.get(monthKey)!.races.push(event); }); return Array.from(groups.values()).sort((a, b) => { if (a.year !== b.year) return b.year - a.year; return b.month.localeCompare(a.month); }); }; const toggleMonth = (monthKey: string) => { setExpandedMonths(prev => { const newSet = new Set(prev); if (newSet.has(monthKey)) { newSet.delete(monthKey); } else { newSet.add(monthKey); } return newSet; }); }; const getRaceStatusBadge = (status: 'scheduled' | 'completed') => { if (status === 'completed') { return Completed; } return Scheduled; }; const formatTime = (scheduledAt: string) => { return DateDisplay.formatDateTime(scheduledAt); }; const groups = groupRacesByMonth(); if (events.length === 0) { return ( No races scheduled for this season. ); } return ( {groups.map((group, groupIndex) => { const monthKey = `${group.year}-${groupIndex}`; const isExpanded = expandedMonths.has(monthKey); return ( {/* Month Header */} toggleMonth(monthKey)} > {group.month} {group.races.length} {group.races.length === 1 ? 'Race' : 'Races'} {/* Race List */} {isExpanded && ( {group.races.map((race, raceIndex) => ( {/* Race Info */} {race.name || `Race ${race.id.substring(0, 4)}`} {getRaceStatusBadge(race.status)} {race.track || 'TBA'} {race.car && ( {race.car} )} {race.sessionType && ( {race.sessionType} )} {formatTime(race.scheduledAt)} {/* Action Buttons */} {race.status === 'scheduled' && ( <> {!race.isUserRegistered && race.canRegister && ( )} {race.isUserRegistered && ( )} {race.canEdit && ( )} {race.canReschedule && ( )} )} {race.status === 'completed' && ( <> )} {/* Always show detail button */} ))} )} ); })} ); }