package model // GameDetail is the deeper, on-demand data for a single game, fetched from // ESPN's summary endpoint and shown in the detail view. It is league-agnostic: // soccer populates Events (goals/cards/subs), the stick-and-ball sports // populate BoxScore (player stat tables). Either may be empty. type GameDetail struct { Events []MatchEvent // soccer key events, chronological BoxScore []TeamBox // per-team player stat tables (away, home) TeamStats []TeamStat // team-vs-team comparison stats (soccer), display order } // TeamStat is one away-vs-home comparison metric (possession, shots, corners…), // rendered as a split/mirrored bar in the detail view. Values are ESPN's // formatted display strings ("63.2", "11", "4"). type TeamStat struct { Label string // "Possession", "Shots", … Key string // ESPN stat name, e.g. "possessionPct" Away string Home string } // MatchEvent is one notable in-match moment (goal, card, substitution…). type MatchEvent struct { Clock string // display minute, e.g. "8'" Period int // 1=first half, 2=second… Type string // "Goal", "Yellow Card", "Substitution", … Text string // full description ShortText string // concise label, e.g. "Jaidon Anthony Goal" Team string // team display name the event belongs to TeamID string // ESPN team id (preferred for side matching) Athletes []string // involved players (scorer first, then assists) Scoring bool // true for goals / scoring plays } // TeamBox is one team's box score: a set of stat groups (batting/pitching, // passing/rushing, a single group for basketball, …). type TeamBox struct { Abbr string Name string Groups []StatGroup } // StatGroup is one labeled table of player rows (e.g. "passing"). type StatGroup struct { Name string // group label, e.g. "batting", "passing" Labels []string // column headers, parallel to each PlayerRow.Stats Rows []PlayerRow } // PlayerRow is one athlete's stat line within a group. type PlayerRow struct { Athlete string Stats []string // parallel to the group's Labels }