import { Link } from "react-router"; import { Card, CardHeader, CardTitle, CardContent, CardDescription } from "~/components/ui/card"; import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from "~/components/ui/table"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; interface TeamScoreBreakdownProps { leagueId: string; seasonId: string; breakdown: { team: { id: string; name: string; } | null; picks: Array<{ pickNumber: number; round: number; participant: { id: string; name: string; sport: string; sportsSeasonId: string; }; finalPosition: number | null; points: number; projectedPoints: number | null; isComplete: boolean; }>; bySport: Record }>; totalPoints: number; actualPoints: number; projectedPoints: number; completedCount: number; totalCount: number; }; standing: { currentRank: number; placementCounts: { first: number; second: number; third: number; fourth: number; fifth: number; sixth: number; seventh: number; eighth: number; }; } | null; } /** * Display detailed team score breakdown with all drafted participants * Phase 4.3: Team breakdown pages */ export function TeamScoreBreakdown({ leagueId, seasonId, breakdown, standing, }: TeamScoreBreakdownProps) { if (!breakdown.team) { return (
Team not found
); } const sportEntries = Object.entries(breakdown.bySport).sort(([a], [b]) => a.localeCompare(b)); return (
{/* Header with team info and summary */}

{breakdown.team.name}

Team Score Breakdown

{breakdown.actualPoints.toFixed(1)}
Actual Points
{breakdown.projectedPoints > breakdown.actualPoints && (
{breakdown.projectedPoints.toFixed(1)} projected
)} {standing && ( Rank #{standing.currentRank} )}
{/* Summary stats */}
Actual Points
{breakdown.actualPoints.toFixed(1)}

From {breakdown.completedCount} finished

Projected Points
{breakdown.projectedPoints.toFixed(1)}

+{(breakdown.projectedPoints - breakdown.actualPoints).toFixed(1)} expected value

Participants
{breakdown.completedCount} / {breakdown.totalCount}

{breakdown.totalCount - breakdown.completedCount} remaining

{standing && ( <> Top Finishes
{standing.placementCounts.first > 0 && (
1st place {standing.placementCounts.first}
)} {standing.placementCounts.second > 0 && (
2nd place {standing.placementCounts.second}
)} {standing.placementCounts.third > 0 && (
3rd place {standing.placementCounts.third}
)} {standing.placementCounts.first === 0 && standing.placementCounts.second === 0 && standing.placementCounts.third === 0 && (

No podium finishes yet

)}
All Placements
{[ { label: "4th", count: standing.placementCounts.fourth }, { label: "5th", count: standing.placementCounts.fifth }, { label: "6th", count: standing.placementCounts.sixth }, { label: "7th", count: standing.placementCounts.seventh }, { label: "8th", count: standing.placementCounts.eighth }, ].map((item) => (
{item.label}: {item.count}
))}
)}
{/* Participants grouped by sport */} {sportEntries.map(([sportName, sportData]) => { const { sportsSeasonId, picks: sportPicks } = sportData; const sportTotal = sportPicks.reduce((sum: number, p) => sum + p.points, 0); const sportCompleted = sportPicks.filter((p) => p.isComplete).length; return (
{sportName}
{sportPicks.length} {sportPicks.length === 1 ? 'pick' : 'picks'} · {sportCompleted} completed
{sportTotal.toFixed(1)}
points
Pick # Participant Position Points {sportPicks.map((pick: typeof sportPicks[number]) => ( #{pick.pickNumber} (R{pick.round}) {pick.participant.name} {pick.isComplete ? ( pick.finalPosition === 0 ? ( Did Not Score ) : ( ) ) : ( Pending )} {pick.isComplete ? ( {pick.points > 0 ? pick.points.toFixed(1) : '0.0'} ) : pick.projectedPoints !== null ? (
Projected: {pick.projectedPoints.toFixed(1)}
) : ( - )}
))}
); })} {/* Navigation */}
); } /** * Display placement badge with color coding */ function PlacementBadge({ position }: { position: number }) { const badges: Record = { 1: { label: "1st", className: "bg-yellow-500 hover:bg-yellow-600 text-white" }, 2: { label: "2nd", className: "bg-gray-400 hover:bg-gray-500 text-white" }, 3: { label: "3rd", className: "bg-orange-600 hover:bg-orange-700 text-white" }, 4: { label: "4th", className: "bg-blue-600 hover:bg-blue-700 text-white" }, 5: { label: "5th", className: "bg-purple-600 hover:bg-purple-700 text-white" }, 6: { label: "6th", className: "bg-green-600 hover:bg-green-700 text-white" }, 7: { label: "7th", className: "bg-pink-600 hover:bg-pink-700 text-white" }, 8: { label: "8th", className: "bg-indigo-600 hover:bg-indigo-700 text-white" }, }; const badge = badges[position] || { label: `${position}th`, className: "" }; return ( {badge.label} ); }