'use client'; import type { LeagueConfigFormModel } from '@/lib/types/LeagueConfigFormModel'; import { Card } from '@/ui/Card'; import { Grid } from '@/ui/Grid'; import { Heading } from '@/ui/Heading'; import { Icon } from '@/ui/Icon'; import { Stack } from '@/ui/Stack'; import { Text } from '@/ui/Text'; import { Award, Calendar, Check, Clock, Flag, Gamepad2, Globe, Medal, Rocket, Timer, Trophy, User, Users, UsersRound, Zap, type LucideIcon, } from 'lucide-react'; import { DateFormatter } from '@/lib/formatters/DateFormatter'; // Individual review card component function ReviewCard({ icon, iconColor = 'text-primary-blue', bgColor = 'bg-primary-blue/10', title, children, }: { icon: LucideIcon; iconColor?: string; bgColor?: string; title: string; children: React.ReactNode; }) { return ( {title} {children} ); } // Info row component for consistent layout function InfoRow({ icon, label, value, valueClass = '', }: { icon?: LucideIcon; label: string; value: React.ReactNode; valueClass?: string; }) { return ( {icon && } {label} {value} ); } export function LeagueReviewSummary({ form, presets }: LeagueReviewSummaryProps) { const { basics, structure, timings, scoring, championships, dropPolicy, stewarding } = form; const seasonName = (form as LeagueConfigFormModel & { seasonName?: string }).seasonName; const modeLabel = structure.mode === 'solo' ? 'Solo drivers' : 'Team-based'; const capacityValue = (() => { if (structure.mode === 'solo') { return typeof structure.maxDrivers === 'number' ? structure.maxDrivers : '—'; } return typeof structure.maxTeams === 'number' ? structure.maxTeams : '—'; })(); const capacityLabel = structure.mode === 'solo' ? 'drivers' : 'teams'; const formatMinutes = (value: number | undefined) => { if (typeof value !== 'number' || value <= 0) return '—'; return `${value} min`; }; const getDropRuleInfo = () => { if (dropPolicy.strategy === 'none') { return { emoji: '✓', label: 'All count', description: 'Every race counts' }; } if (dropPolicy.strategy === 'bestNResults') { return { emoji: '🏆', label: `Best ${dropPolicy.n ?? 'N'}`, description: `Only best ${dropPolicy.n ?? 'N'} results count`, }; } if (dropPolicy.strategy === 'dropWorstN') { return { emoji: '🗑️', label: `Drop ${dropPolicy.n ?? 'N'}`, description: `Worst ${dropPolicy.n ?? 'N'} dropped`, }; } return { emoji: '✓', label: 'All count', description: 'Every race counts' }; }; const dropRuleInfo = getDropRuleInfo(); const preset = presets.find((p) => p.id === scoring.patternId) ?? null; const seasonStartLabel = timings.seasonStartDate ? DateFormatter.formatShort(timings.seasonStartDate) : null; const stewardingLabel = (() => { switch (stewarding.decisionMode) { case 'admin_only': return 'Admin-only decisions'; case 'steward_vote': return 'Steward panel voting'; default: return stewarding.decisionMode; } })(); const getScoringEmoji = () => { if (!preset) return '🏁'; const name = preset.name.toLowerCase(); if (name.includes('sprint') || name.includes('double')) return '⚡'; if (name.includes('endurance') || name.includes('long')) return '🏆'; if (name.includes('club') || name.includes('casual')) return '🏅'; return '🏁'; }; // Normalize visibility to new terminology const isRanked = basics.visibility === 'public'; // public = ranked, private/unlisted = unranked const visibilityLabel = isRanked ? 'Ranked' : 'Unranked'; const visibilityDescription = isRanked ? 'Competitive • Affects ratings' : 'Casual • Friends only'; // Calculate total weekend duration const totalWeekendMinutes = (timings.practiceMinutes ?? 0) + (timings.qualifyingMinutes ?? 0) + (timings.sprintRaceMinutes ?? 0) + (timings.mainRaceMinutes ?? 0); return ( {/* League Summary */} League summary {/* Background decoration */} {null} {null} {basics.name || 'Your New League'} {basics.description || 'Ready to launch your racing series!'} {/* Ranked/Unranked Badge */} {visibilityLabel} • {visibilityDescription} iRacing {modeLabel} {/* Season Summary */} First season summary {seasonName || 'First season of this league'} {seasonStartLabel && ( <> Starts {seasonStartLabel} )} {typeof timings.roundsPlanned === 'number' && ( <> {timings.roundsPlanned} rounds planned )} Stewarding: {stewardingLabel} {/* Stats Grid */} {/* Capacity */} {capacityValue} {capacityLabel} {/* Rounds */} {timings.roundsPlanned ?? '—'} rounds {/* Weekend Duration */} {totalWeekendMinutes > 0 ? `${totalWeekendMinutes}` : '—'} min/weekend {/* Championships */} {[championships.enableDriverChampionship, championships.enableTeamChampionship, championships.enableNationsChampionship, championships.enableTrophyChampionship].filter(Boolean).length} championships {/* Detail Cards Grid */} {/* Schedule Card */} {timings.practiceMinutes && timings.practiceMinutes > 0 && ( )} {timings.sprintRaceMinutes && timings.sprintRaceMinutes > 0 && ( )} {/* Scoring Card */} {/* Scoring Preset */} {getScoringEmoji()} {preset?.name ?? 'Custom'} {preset?.sessionSummary ?? 'Custom scoring enabled'} {scoring.customScoringEnabled && ( Custom )} {/* Drop Rule */} {dropRuleInfo.emoji} {dropRuleInfo.label} {dropRuleInfo.description} {/* Championships Section */} {championships.enableDriverChampionship && ( Driver Championship )} {championships.enableTeamChampionship && ( Team Championship )} {championships.enableNationsChampionship && ( Nations Cup )} {championships.enableTrophyChampionship && ( Trophy Championship )} {![championships.enableDriverChampionship, championships.enableTeamChampionship, championships.enableNationsChampionship, championships.enableTrophyChampionship].some(Boolean) && ( No championships enabled )} {/* Ready to launch message */} Ready to launch! Click "Create League" to launch your racing series. You can modify all settings later. ); }