#![doc = include_str!("../../docs/league/matchup.md")]
use std::collections::BTreeMap;
use std::fmt;
#[cfg(feature = "rocket_okapi")]
use rocket_okapi::okapi::schemars;
#[cfg(feature = "rocket_okapi")]
use rocket_okapi::okapi::schemars::JsonSchema;
use serde::{Serialize, Deserialize};
use crate::game::stat::OffensiveStats;
use crate::league::season::matchup::LeagueSeasonMatchups;
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[cfg_attr(feature = "wasm", derive(tsify_next::Tsify))]
#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize, Deserialize)]
pub struct LeagueTeamRecord {
wins: usize,
losses: usize,
ties: usize
}
impl Default for LeagueTeamRecord {
fn default() -> Self {
LeagueTeamRecord{
wins: 0,
losses: 0,
ties: 0
}
}
}
impl LeagueTeamRecord {
pub fn new() -> LeagueTeamRecord {
LeagueTeamRecord{
wins: 0,
losses: 0,
ties: 0
}
}
pub fn wins(&self) -> &usize {
&self.wins
}
pub fn increment_wins(&mut self, n: usize) {
self.wins += n
}
pub fn losses(&self) -> &usize {
&self.losses
}
pub fn increment_losses(&mut self, n: usize) {
self.losses += n
}
pub fn ties(&self) -> &usize {
&self.ties
}
pub fn increment_ties(&mut self, n: usize) {
self.ties += n
}
}
impl fmt::Display for LeagueTeamRecord {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}-{}-{}", self.wins, self.losses, self.ties)
}
}
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize)]
pub struct LeagueMatchups {
matchups: BTreeMap<usize, LeagueSeasonMatchups>
}
impl LeagueMatchups {
pub fn new(matchups: BTreeMap<usize, LeagueSeasonMatchups>) -> LeagueMatchups {
LeagueMatchups{
matchups
}
}
pub fn matchups(&self) -> &BTreeMap<usize, LeagueSeasonMatchups> {
&self.matchups
}
pub fn record(&self) -> LeagueTeamRecord {
let mut record = LeagueTeamRecord::new();
for (_, season) in self.matchups.iter() {
let season_record = season.record();
record.increment_wins(*season_record.wins());
record.increment_losses(*season_record.losses());
record.increment_ties(*season_record.ties());
}
record
}
pub fn stats(&self) -> OffensiveStats {
let mut stats = OffensiveStats::new();
for (_, season) in self.matchups.iter() {
let season_stats = season.stats();
stats.increment_passing(season_stats.passing());
stats.increment_rushing(season_stats.rushing());
stats.increment_receiving(season_stats.receiving());
}
stats
}
}