package seasonsview import "git.haelnorr.com/h/oslstats/internal/db" import "git.haelnorr.com/h/oslstats/internal/view/baseview" import "git.haelnorr.com/h/oslstats/internal/view/component/links" import "fmt" // SeriesGameResult holds the parsed result for a single game in the series review type SeriesGameResult struct { GameNumber int Result *db.FixtureResult UnmappedPlayers []string FreeAgentWarnings []FreeAgentWarning } templ SeriesReviewResultPage( series *db.PlayoffSeries, gameResults []*SeriesGameResult, ) { {{ backURL := fmt.Sprintf("/series/%d", series.ID) team1Name := seriesTeamName(series.Team1) team2Name := seriesTeamName(series.Team2) // Calculate series score from the results team1Wins := 0 team2Wins := 0 for _, gr := range gameResults { if gr.Result != nil { if gr.Result.Winner == "home" { team1Wins++ } else { team2Wins++ } } } }} @baseview.Layout(fmt.Sprintf("Review Series Result — %s vs %s", team1Name, team2Name)) {

Review Series Result

{ team1Name } vs { team2Name } { series.Label }

Back to Series

Series Result

if series.Team1 != nil && series.Team1.Color != "" {
}

{ team1Name }

team2Wins), templ.KV("text-text", team1Wins <= team2Wins) }> { fmt.Sprint(team1Wins) }

if team1Wins > team2Wins { Winner }
if series.Team2 != nil && series.Team2.Color != "" {
}

{ team2Name }

team1Wins), templ.KV("text-text", team2Wins <= team1Wins) }> { fmt.Sprint(team2Wins) }

if team2Wins > team1Wins { Winner }

{ fmt.Sprint(len(gameResults)) } game(s) played

for _, gr := range gameResults { @seriesReviewGameCard(series, gr) }

Actions

} } templ seriesReviewGameCard(series *db.PlayoffSeries, gr *SeriesGameResult) { {{ team1Name := seriesTeamName(series.Team1) team2Name := seriesTeamName(series.Team2) result := gr.Result homeWon := result.Winner == "home" winnerName := team2Name if homeWon { winnerName = team1Name } hasWarnings := result.TamperingDetected || len(gr.UnmappedPlayers) > 0 || len(gr.FreeAgentWarnings) > 0 }}

Game { fmt.Sprint(gr.GameNumber) }

if hasWarnings { }
{ team1Name } { fmt.Sprint(result.HomeScore) } - { fmt.Sprint(result.AwayScore) } { team2Name } { winnerName }
if hasWarnings {
if result.TamperingDetected && result.TamperingReason != nil {
⚠ Inconsistent Data Detected

{ *result.TamperingReason }

This does not block finalization but should be reviewed carefully.

} if len(gr.FreeAgentWarnings) > 0 {
⚠ Free Agent Issues
    for _, fa := range gr.FreeAgentWarnings {
  • { fa.Name } — { fa.Reason }
  • }
} if len(gr.UnmappedPlayers) > 0 {
⚠ Unmapped Players

Could not be matched to registered players.

    for _, p := range gr.UnmappedPlayers {
  • { p }
  • }
}
}

{ team1Name }

{ fmt.Sprint(result.HomeScore) }

{ team2Name }

{ fmt.Sprint(result.AwayScore) }

if result.Arena != "" { { result.Arena } } if result.EndReason != "" { { result.EndReason } } Winner: { winnerName }
if series.Team1 != nil { @seriesReviewTeamStats(series.Team1, result, "home", series.Bracket.Season, series.Bracket.League) } if series.Team2 != nil { @seriesReviewTeamStats(series.Team2, result, "away", series.Bracket.Season, series.Bracket.League) }
} templ seriesReviewTeamStats(team *db.Team, result *db.FixtureResult, side string, season *db.Season, league *db.League) { {{ type playerStat struct { Username string PlayerID *int Stats *db.FixtureResultPlayerStats } finalStats := []*playerStat{} seen := map[string]bool{} for _, ps := range result.PlayerStats { if ps.Team == side && ps.PeriodNum == 3 { if !seen[ps.PlayerGameUserID] { seen[ps.PlayerGameUserID] = true finalStats = append(finalStats, &playerStat{ Username: ps.PlayerUsername, PlayerID: ps.PlayerID, Stats: ps, }) } } } }}
if team.Color != "" { }

if side == "home" { Team 1 — } else { Team 2 — } @links.TeamNameLinkInSeason(team, season, league)

for _, ps := range finalStats { } if len(finalStats) == 0 { }
Player PP G A SV SH BL PA SC
if ps.PlayerID != nil { @links.PlayerLinkFromStats(*ps.PlayerID, ps.Username) } else { { ps.Username } ? } if ps.Stats.IsFreeAgent { FA } { intPtrStr(ps.Stats.PeriodsPlayed) } { intPtrStr(ps.Stats.Goals) } { intPtrStr(ps.Stats.Assists) } { intPtrStr(ps.Stats.Saves) } { intPtrStr(ps.Stats.Shots) } { intPtrStr(ps.Stats.Blocks) } { intPtrStr(ps.Stats.Passes) } { intPtrStr(ps.Stats.Score) }
No player stats recorded
}