private void highlightAndAddPlayers(KeyValuePair<int, PlayerStats> pair, ref ObservableCollection<PlayerStatsRow> psrObservable)
 {
     var psr = new PlayerStatsRow(pair.Value);
     if (_playersToHighlight.Contains(psr.ID))
     {
         psr.Highlight = true;
     }
     psrObservable.Add(psr);
 }
        private bool doPlayer(PlayerStats ps)
        {
            if (ps.IsHidden)
            {
                return true;
            }
            var psr = new PlayerStatsRow(ps);
            var plPSR = new PlayerStatsRow(ps, true);

            if (psr.IsSigned)
            {
                if (!inCurrentFilter(_tst[psr.TeamF]))
                {
                    return true;
                }
                psr.TeamFDisplay = _tst[psr.TeamF].DisplayName;
                plPSR.TeamFDisplay = psr.TeamFDisplay;
            }
            else
            {
                if (_filterType != TeamFilter.League)
                {
                    return true;
                }

                psr.TeamFDisplay = "- Free Agency -";
                plPSR.TeamFDisplay = psr.TeamFDisplay;
            }
            _psrListSea.Add(psr);
            _psrListPl.Add(plPSR);
            return false;
        }
        /// <summary>
        ///     Initializes a new instance of the <see cref="PlayerStats" /> class.
        /// </summary>
        /// <param name="playerStatsRow">The player stats row.</param>
        /// <param name="playoffs">
        ///     if set to <c>true</c> the row is assumed to contain playoff stats.
        /// </param>
        public PlayerStats(PlayerStatsRow playerStatsRow, bool playoffs = false)
            : this()
        {
            LastName = playerStatsRow.LastName;
            FirstName = playerStatsRow.FirstName;

            if (!playoffs)
            {
                Totals[PAbbrT.GP] = playerStatsRow.GP;
                Totals[PAbbrT.GS] = playerStatsRow.GS;
                Totals[PAbbrT.MINS] = playerStatsRow.MINS;
                Totals[PAbbrT.PTS] = playerStatsRow.PTS;
                Totals[PAbbrT.FGM] = playerStatsRow.FGM;
                Totals[PAbbrT.FGA] = playerStatsRow.FGA;
                Totals[PAbbrT.TPM] = playerStatsRow.TPM;
                Totals[PAbbrT.TPA] = playerStatsRow.TPA;
                Totals[PAbbrT.FTM] = playerStatsRow.FTM;
                Totals[PAbbrT.FTA] = playerStatsRow.FTA;
                Totals[PAbbrT.OREB] = playerStatsRow.OREB;
                Totals[PAbbrT.DREB] = playerStatsRow.DREB;
                Totals[PAbbrT.STL] = playerStatsRow.STL;
                Totals[PAbbrT.TOS] = playerStatsRow.TOS;
                Totals[PAbbrT.BLK] = playerStatsRow.BLK;
                Totals[PAbbrT.AST] = playerStatsRow.AST;
                Totals[PAbbrT.FOUL] = playerStatsRow.FOUL;

                Metrics["GmSc"] = playerStatsRow.GmSc;
                Metrics["GmScE"] = playerStatsRow.GmScE;
                Metrics["EFF"] = playerStatsRow.EFF;
                Metrics["EFG%"] = playerStatsRow.EFGp;
                Metrics["TS%"] = playerStatsRow.TSp;
                Metrics["AST%"] = playerStatsRow.ASTp;
                Metrics["STL%"] = playerStatsRow.STLp;
                Metrics["TO%"] = playerStatsRow.TOp;
                Metrics["USG%"] = playerStatsRow.USGp;
                Metrics["PTSR"] = playerStatsRow.PTSR;
                Metrics["REBR"] = playerStatsRow.REBR;
                Metrics["OREBR"] = playerStatsRow.OREBR;
                Metrics["ASTR"] = playerStatsRow.ASTR;
                Metrics["BLKR"] = playerStatsRow.BLKR;
                Metrics["STLR"] = playerStatsRow.STLR;
                Metrics["TOR"] = playerStatsRow.TOR;
                Metrics["FTR"] = playerStatsRow.FTR;
                Metrics["PER"] = playerStatsRow.PER;
                Metrics["BLK%"] = playerStatsRow.BLKp;
                Metrics["DREB%"] = playerStatsRow.DREBp;
                Metrics["OREB%"] = playerStatsRow.OREBp;
                Metrics["REB%"] = playerStatsRow.REBp;
                Metrics["PPR"] = playerStatsRow.PPR;
            }
            else
            {
                PlTotals[PAbbrT.GP] = playerStatsRow.GP;
                PlTotals[PAbbrT.GS] = playerStatsRow.GS;
                PlTotals[PAbbrT.MINS] = playerStatsRow.MINS;
                PlTotals[PAbbrT.PTS] = playerStatsRow.PTS;
                PlTotals[PAbbrT.FGM] = playerStatsRow.FGM;
                PlTotals[PAbbrT.FGA] = playerStatsRow.FGA;
                PlTotals[PAbbrT.TPM] = playerStatsRow.TPM;
                PlTotals[PAbbrT.TPA] = playerStatsRow.TPA;
                PlTotals[PAbbrT.FTM] = playerStatsRow.FTM;
                PlTotals[PAbbrT.FTA] = playerStatsRow.FTA;
                PlTotals[PAbbrT.OREB] = playerStatsRow.OREB;
                PlTotals[PAbbrT.DREB] = playerStatsRow.DREB;
                PlTotals[PAbbrT.STL] = playerStatsRow.STL;
                PlTotals[PAbbrT.TOS] = playerStatsRow.TOS;
                PlTotals[PAbbrT.BLK] = playerStatsRow.BLK;
                PlTotals[PAbbrT.AST] = playerStatsRow.AST;
                PlTotals[PAbbrT.FOUL] = playerStatsRow.FOUL;

                PlMetrics["GmSc"] = playerStatsRow.GmSc;
                PlMetrics["GmScE"] = playerStatsRow.GmScE;
                PlMetrics["EFF"] = playerStatsRow.EFF;
                PlMetrics["EFG%"] = playerStatsRow.EFGp;
                PlMetrics["TS%"] = playerStatsRow.TSp;
                PlMetrics["AST%"] = playerStatsRow.ASTp;
                PlMetrics["STL%"] = playerStatsRow.STLp;
                PlMetrics["TO%"] = playerStatsRow.TOp;
                PlMetrics["USG%"] = playerStatsRow.USGp;
                PlMetrics["PTSR"] = playerStatsRow.PTSR;
                PlMetrics["REBR"] = playerStatsRow.REBR;
                PlMetrics["OREBR"] = playerStatsRow.OREBR;
                PlMetrics["ASTR"] = playerStatsRow.ASTR;
                PlMetrics["BLKR"] = playerStatsRow.BLKR;
                PlMetrics["STLR"] = playerStatsRow.STLR;
                PlMetrics["TOR"] = playerStatsRow.TOR;
                PlMetrics["FTR"] = playerStatsRow.FTR;
                PlMetrics["PER"] = playerStatsRow.PER;
                PlMetrics["BLK%"] = playerStatsRow.BLKp;
                PlMetrics["DREB%"] = playerStatsRow.DREBp;
                PlMetrics["OREB%"] = playerStatsRow.OREBp;
                PlMetrics["REB%"] = playerStatsRow.REBp;
                PlMetrics["PPR"] = playerStatsRow.PPR;
            }

            ID = playerStatsRow.ID;
            Position1 = playerStatsRow.Position1;
            Position2 = playerStatsRow.Position2;
            TeamF = playerStatsRow.TeamF;
            TeamS = playerStatsRow.TeamS;
            YearOfBirth = playerStatsRow.YearOfBirth;
            YearsPro = playerStatsRow.YearsPro;
            IsSigned = playerStatsRow.IsSigned;
            IsHidden = playerStatsRow.IsHidden;
            IsAllStar = playerStatsRow.IsAllStar;
            Injury = PlayerInjury.InjuryTypes.ContainsValue(playerStatsRow.InjuryName)
                         ? new PlayerInjury(
                               PlayerInjury.InjuryTypes.Single(pi => pi.Value == playerStatsRow.InjuryName).Key,
                               playerStatsRow.InjuryDaysLeft)
                         : new PlayerInjury(playerStatsRow.InjuryName, playerStatsRow.InjuryDaysLeft);
            IsNBAChampion = playerStatsRow.IsNBAChampion;

            Contract.Option = playerStatsRow.ContractOption;
            Contract.ContractSalaryPerYear.Clear();
            for (var i = 1; i <= 7; i++)
            {
                var salary = Convert.ToInt32(typeof(PlayerStatsRow).GetProperty("ContractY" + i).GetValue(playerStatsRow, null));
                if (salary == 0)
                {
                    break;
                }

                Contract.ContractSalaryPerYear.Add(salary);
            }

            Height = playerStatsRow.Height;
            Weight = playerStatsRow.Weight;

            CalcAvg();
        }
 private static int comparePSRs(string property, PlayerStatsRow pmsr1, PlayerStatsRow pmsr2)
 {
     return
         Convert.ToDouble(typeof (PlayerStatsRow).GetProperty(property).GetValue(pmsr1, null))
                .CompareTo(Convert.ToDouble(typeof (PlayerStatsRow).GetProperty(property).GetValue(pmsr2, null)));
 }
        public void UpdateContract(PlayerStatsRow psr)
        {
            Contract.Option = psr.ContractOption;
            Contract.ContractSalaryPerYear.Clear();
            for (var i = 1; i <= 7; i++)
            {
                var salary = Convert.ToInt32(typeof(PlayerStatsRow).GetProperty("ContractY" + i).GetValue(psr, null));
                if (salary == 0)
                {
                    break;
                }

                Contract.ContractSalaryPerYear.Add(salary);
            }
        }
        /// <summary>Updates the playoff stats.</summary>
        /// <param name="pl_psr">The Playoffs PlayerStatsRow instance to get the stats from.</param>
        public void UpdatePlayoffStats(PlayerStatsRow pl_psr)
        {
            PlTotals[PAbbrT.GP] = pl_psr.GP;
            PlTotals[PAbbrT.GS] = pl_psr.GS;
            PlTotals[PAbbrT.MINS] = pl_psr.MINS;
            PlTotals[PAbbrT.PTS] = pl_psr.PTS;
            PlTotals[PAbbrT.FGM] = pl_psr.FGM;
            PlTotals[PAbbrT.FGA] = pl_psr.FGA;
            PlTotals[PAbbrT.TPM] = pl_psr.TPM;
            PlTotals[PAbbrT.TPA] = pl_psr.TPA;
            PlTotals[PAbbrT.FTM] = pl_psr.FTM;
            PlTotals[PAbbrT.FTA] = pl_psr.FTA;
            PlTotals[PAbbrT.OREB] = pl_psr.OREB;
            PlTotals[PAbbrT.DREB] = pl_psr.DREB;
            PlTotals[PAbbrT.STL] = pl_psr.STL;
            PlTotals[PAbbrT.TOS] = pl_psr.TOS;
            PlTotals[PAbbrT.BLK] = pl_psr.BLK;
            PlTotals[PAbbrT.AST] = pl_psr.AST;
            PlTotals[PAbbrT.FOUL] = pl_psr.FOUL;

            CalcAvg(true);
        }
        /// <summary>
        ///     Prepares and presents the player stats.
        /// </summary>
        /// <param name="leaders">
        ///     if set to <c>true</c>, the stats are calculated based on the NBA rules for League Leaders standings.
        /// </param>
        private void preparePlayerStats()
        {
            _psrList = new List<PlayerStatsRow>();
            _lPSR = new List<PlayerStatsRow>();

            _plPSRList = new List<PlayerStatsRow>();
            _plLpsr = new List<PlayerStatsRow>();

            _leadersList = new List<PlayerStatsRow>();
            _plLeadersList = new List<PlayerStatsRow>();

            _myLeadersList = new List<PlayerStatsRow>();
            _plMyLeadersList = new List<PlayerStatsRow>();

            var worker1 = new BackgroundWorker {WorkerReportsProgress = true};

            txbStatus.FontWeight = FontWeights.Bold;
            txbStatus.Text = "Please wait while player PerGame and metric stats are being calculated...";

            int i = 0;

            int playerCount = -1;

            worker1.DoWork += delegate
                {
                    _sem.WaitOne();
                    _psrList = new List<PlayerStatsRow>();
                    _lPSR = new List<PlayerStatsRow>();

                    _plPSRList = new List<PlayerStatsRow>();
                    _plLpsr = new List<PlayerStatsRow>();

                    playerCount = _pst.Count;
                    foreach (var kvp in _pst)
                    {
                        if (kvp.Value.IsHidden)
                        {
                            continue;
                        }
                        var psr = new PlayerStatsRow(kvp.Value);
                        var plPSR = new PlayerStatsRow(kvp.Value, true);

                        if (psr.IsActive)
                        {
                            if (!inCurrentFilter(_tst[psr.TeamF]))
                            {
                                continue;
                            }
                            psr.TeamFDisplay = _tst[psr.TeamF].DisplayName;
                            plPSR.TeamFDisplay = psr.TeamFDisplay;
                        }
                        else
                        {
                            if (_filterType != TeamFilter.League)
                            {
                                continue;
                            }

                            psr.TeamFDisplay = "- Inactive -";
                            plPSR.TeamFDisplay = psr.TeamFDisplay;
                        }
                        _psrList.Add(psr);
                        _plPSRList.Add(plPSR);
                        worker1.ReportProgress(1);
                    }
                    PlayerStats leagueAverages = PlayerStats.CalculateLeagueAverages(_pst, _tst);
                    _lPSR.Add(new PlayerStatsRow(leagueAverages));
                    _plLpsr.Add(new PlayerStatsRow(leagueAverages, true));

                    _psrList.Sort((psr1, psr2) => psr1.GmSc.CompareTo(psr2.GmSc));
                    _psrList.Reverse();

                    _plPSRList.Sort((psr1, psr2) => psr1.GmSc.CompareTo(psr2.GmSc));
                    _plPSRList.Reverse();

                    foreach (PlayerStatsRow psr in _psrList)
                    {
                        if (psr.IsActive)
                        {
                            _leadersList.Add(psr.ConvertToLeagueLeader(_tst));
                            _myLeadersList.Add(psr.ConvertToMyLeagueLeader(_tst));
                        }
                    }
                    foreach (PlayerStatsRow psr in _plPSRList)
                    {
                        if (psr.IsActive)
                        {
                            _plLeadersList.Add(psr.ConvertToLeagueLeader(_tst, true));
                            _plMyLeadersList.Add(psr.ConvertToMyLeagueLeader(_tst, true));
                        }
                    }

                    _leadersList.Sort((psr1, psr2) => psr1.PPG.CompareTo(psr2.PPG));
                    _leadersList.Reverse();

                    _plLeadersList.Sort((psr1, psr2) => psr1.PPG.CompareTo(psr2.PPG));
                    _plLeadersList.Reverse();

                    _myLeadersList.Sort((psr1, psr2) => psr1.PPG.CompareTo(psr2.PPG));
                    _myLeadersList.Reverse();

                    _plMyLeadersList.Sort((psr1, psr2) => psr1.PPG.CompareTo(psr2.PPG));
                    _plMyLeadersList.Reverse();
                };

            worker1.ProgressChanged += delegate
                {
                    if (++i < playerCount)
                    {
                        txbStatus.Text = "Please wait while player PerGame and metric stats are being calculated (" + i + "/" +
                                         playerCount + " completed)...";
                    }
                    else
                    {
                        txbStatus.Text = "Please wait as best performers and best starting 5 are being calculated...";
                    }
                };

            worker1.RunWorkerCompleted += delegate
                {
                    bool isSeason = rbSeason.IsChecked.GetValueOrDefault();
                    dgvPlayerStats.ItemsSource = isSeason ? _psrList : _plPSRList;
                    dgvLeaguePlayerStats.ItemsSource = isSeason ? _lPSR : _plLpsr;
                    dgvMetricStats.ItemsSource = isSeason ? _psrList : _plPSRList;
                    dgvLeagueMetricStats.ItemsSource = isSeason ? _lPSR : _plLpsr;
                    dgvRatings.ItemsSource = isSeason ? _psrList : _plPSRList;
                    dgvContracts.ItemsSource = isSeason ? _psrList : _plPSRList;
                    dgvLeaders.ItemsSource = isSeason ? _leadersList : _plLeadersList;
                    dgvMyLeaders.ItemsSource = isSeason ? _myLeadersList : _plMyLeadersList;

                    populateSituationalsCombo();

                    updateUltimateTeamTextboxes(isSeason);
                    updateBestPerformersTextboxes(isSeason);

                    tbcLeagueOverview.Visibility = Visibility.Visible;
                    txbStatus.FontWeight = FontWeights.Normal;
                    txbStatus.Text = _message;
                    _sem.Release();
                };

            tbcLeagueOverview.Visibility = Visibility.Hidden;
            worker1.RunWorkerAsync();
        }
        private void updateScoutingReport()
        {
            int id = _selectedPlayerID;

            if (MainWindow.PST[id].Totals[PAbbr.GP] > 0)
            {
                grpSeasonScoutingReport.Visibility = Visibility.Visible;
                grpSeasonFacts.Visibility = Visibility.Visible;
                grpSeasonLeadersFacts.Visibility = Visibility.Visible;

                string msg = new PlayerStatsRow(MainWindow.PST[id], false, false).ScoutingReport(MainWindow.PST,
                                                                                                 _cumSeasonRankingsActive,
                                                                                                 _cumSeasonRankingsTeam,
                                                                                                 _cumSeasonRankingsPosition, _pbsList,
                                                                                                 txbGame1.Text);
                txbSeasonScoutingReport.Text = msg;

                List<string> facts = GetFacts(id, _cumSeasonRankingsActive);
                txbSeasonFacts.Text = aggregateFacts(facts);
                if (facts.Count == 0)
                {
                    grpSeasonFacts.Visibility = Visibility.Collapsed;
                }

                facts = GetFacts(id, MainWindow.SeasonLeadersRankings, true);
                txbSeasonLeadersFacts.Text = aggregateFacts(facts);
                if (facts.Count == 0)
                {
                    grpSeasonLeadersFacts.Visibility = Visibility.Collapsed;
                }
            }
            else
            {
                grpSeasonScoutingReport.Visibility = Visibility.Collapsed;
                grpSeasonFacts.Visibility = Visibility.Collapsed;
                grpSeasonLeadersFacts.Visibility = Visibility.Collapsed;
            }

            if (MainWindow.PST[id].PlTotals[PAbbr.GP] > 0)
            {
                grpPlayoffsScoutingReport.Visibility = Visibility.Visible;
                grpPlayoffsFacts.Visibility = Visibility.Visible;
                grpPlayoffsLeadersFacts.Visibility = Visibility.Visible;

                string msg = new PlayerStatsRow(MainWindow.PST[id], true, false).ScoutingReport(MainWindow.PST,
                                                                                                _cumPlayoffsRankingsActive,
                                                                                                _cumPlayoffsRankingsTeam,
                                                                                                _cumPlayoffsRankingsPosition, _pbsList,
                                                                                                txbGame1.Text);
                txbPlayoffsScoutingReport.Text = msg;

                List<string> facts = GetFacts(id, _cumPlayoffsRankingsActive);
                txbPlayoffsFacts.Text = aggregateFacts(facts);
                if (facts.Count == 0)
                {
                    grpPlayoffsFacts.Visibility = Visibility.Collapsed;
                }

                facts = GetFacts(id, MainWindow.PlayoffsLeadersRankings, true);
                txbPlayoffsLeadersFacts.Text = aggregateFacts(facts);
                if (facts.Count == 0)
                {
                    grpPlayoffsLeadersFacts.Visibility = Visibility.Collapsed;
                }
            }
            else
            {
                grpPlayoffsScoutingReport.Visibility = Visibility.Collapsed;
                grpPlayoffsFacts.Visibility = Visibility.Collapsed;
                grpPlayoffsLeadersFacts.Visibility = Visibility.Collapsed;
            }

            svScoutingReport.ScrollToTop();
        }
        private static void updateNotables()
        {
            Dictionary<int, PlayerStats> pstLeaders;
            SeasonLeadersRankings = PlayerRankings.CalculateLeadersRankings(out pstLeaders);
            _notables = new List<string>();

            Dictionary<int, PlayerStats> temp;
            PlayoffsLeadersRankings = PlayerRankings.CalculateLeadersRankings(out temp, true);

            if (pstLeaders.Count == 0)
            {
                return;
            }

            var leadersPSRList = new List<PlayerStatsRow>();
            pstLeaders.Values.ToList().ForEach(
                delegate(PlayerStats ps)
                    {
                        var psr = new PlayerStatsRow(ps, calcRatings: false);
                        leadersPSRList.Add(psr);
                    });
            var psrList = new Dictionary<int, PlayerStatsRow>();
            PST.Values.ToList().ForEach(
                delegate(PlayerStats ps)
                    {
                        var psr = new PlayerStatsRow(ps, calcRatings: false);
                        psrList.Add(psr.ID, psr);
                    });

            //PlayerStatsRow curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.PPG).First().ID);
            PlayerStatsRow curL;
            string m, s;
            float ppg;
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.PPG][1]];

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 3, PAbbrPG.PPG);
                s = String.Format(
                    "PPG Leader: {0} {1} ({2}) ({3:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.PPG,
                    m);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.FGp).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.FGp][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.FGp);
                s = String.Format(
                    "FG% Leader: {0} {1} ({2}) ({3:F3} FG%, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.FGp,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.RPG).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.RPG][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.RPG);
                s = String.Format(
                    "RPG Leader: {0} {1} ({2}) ({3:F1} RPG, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.RPG,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.BPG).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.BPG][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.BPG);
                s = String.Format(
                    "BPG Leader: {0} {1} ({2}) ({3:F1} BPG, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.BPG,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.APG).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.APG][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.APG);
                s = String.Format(
                    "APG Leader: {0} {1} ({2}) ({3:F1} APG, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.APG,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.SPG).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.SPG][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.SPG);
                s = String.Format(
                    "SPG Leader: {0} {1} ({2}) ({3:F1} SPG, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.SPG,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.ORPG).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.ORPG][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.ORPG);
                s = String.Format(
                    "ORPG Leader: {0} {1} ({2}) ({3:F1} ORPG, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.ORPG,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.DRPG).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.DRPG][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.DRPG);
                s = String.Format(
                    "DRPG Leader: {0} {1} ({2}) ({3:F1} DRPG, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.DRPG,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.TPp).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.TPp][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.TPp);
                s = String.Format(
                    "3P% Leader: {0} {1} ({2}) ({3:F3} 3P%, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.TPp,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            //curL = psrList.Single(psr => psr.ID == leadersPSRList.OrderByDescending(pair => pair.FTp).First().ID);
            try
            {
                curL = psrList[SeasonLeadersRankings.RevRankingsPerGame[PAbbrPG.FTp][1]];
                ppg = double.IsNaN(curL.PPG) ? PST[curL.ID].PerGame[PAbbrPG.PPG] : curL.PPG;

                m = getBestStatsForMarquee(curL, SeasonLeadersRankings, 2, PAbbrPG.FTp);
                s = String.Format(
                    "FT% Leader: {0} {1} ({2}) ({3:F3} FT%, {5:F1} PPG, {4})",
                    curL.FirstName,
                    curL.LastName,
                    TST[curL.TeamF].DisplayName,
                    curL.FTp,
                    m,
                    ppg);
                _notables.Add(s);
            }
            catch (KeyNotFoundException e)
            {
                Console.WriteLine(e);
            }

            if (_notables.Count > 0)
            {
                _notables.Shuffle();

                MWInstance.txbMarquee.Text = "League Notables";
                MWInstance._marqueeTimer.Start();
            }
        }
 private static string getBestStatsForMarquee(PlayerStatsRow curLr, PlayerRankings rankingsActive, int count, int statToIgnore)
 {
     var s = "";
     var dict = new Dictionary<int, int>();
     for (var k = 0; k < rankingsActive.RankingsPerGame[curLr.ID].Length; k++)
     {
         dict.Add(k, rankingsActive.RankingsPerGame[curLr.ID][k]);
     }
     dict[PAbbrPG.FPG] = PST.Count + 1 - dict[PAbbrPG.FPG];
     dict[PAbbrPG.TPG] = PST.Count + 1 - dict[PAbbrPG.TPG];
     //dict[t.PAPG] = pst.Count + 1 - dict[t.PAPG];
     var strengths = (from entry in dict orderby entry.Value ascending select entry.Key).ToList();
     var m = 0;
     var j = count;
     while (true)
     {
         if (m == j)
         {
             break;
         }
         if (strengths[m] == statToIgnore || strengths[m] == PAbbrPG.PPG || strengths[m] == PAbbrPG.DRPG)
         {
             j++;
             m++;
             continue;
         }
         switch (strengths[m])
         {
             case PAbbrPG.APG:
                 s += String.Format("{0:F1} APG, ", curLr.APG);
                 break;
             case PAbbrPG.BPG:
                 s += String.Format("{0:F1} BPG, ", curLr.BPG);
                 break;
             case PAbbrPG.DRPG:
                 s += String.Format("{0:F1} DRPG, ", curLr.DRPG);
                 break;
             case PAbbrPG.FGp:
                 s += String.Format("{0:F3} FG%, ", curLr.FGp);
                 break;
             case PAbbrPG.FPG:
                 s += String.Format("{0:F1} FPG, ", curLr.FPG);
                 break;
             case PAbbrPG.FTp:
                 s += String.Format("{0:F3} FT%, ", curLr.FTp);
                 break;
             case PAbbrPG.ORPG:
                 s += String.Format("{0:F1} ORPG, ", curLr.ORPG);
                 break;
             case PAbbrPG.PPG:
                 s += String.Format("{0:F1} PPG, ", curLr.PPG);
                 break;
             case PAbbrPG.RPG:
                 s += String.Format("{0:F1} RPG, ", curLr.RPG);
                 break;
             case PAbbrPG.SPG:
                 s += String.Format("{0:F1} SPG, ", curLr.SPG);
                 break;
             case PAbbrPG.TPG:
                 s += String.Format("{0:F1} TPG, ", curLr.TPG);
                 break;
             case PAbbrPG.TPp:
                 s += String.Format("{0:F3} 3P%, ", curLr.TPp);
                 break;
             default:
                 j++;
                 break;
         }
         m++;
     }
     s = s.TrimEnd(new[] { ' ', ',' });
     return s;
 }
        /// <summary>
        ///     Handles the SelectionChanged event of the cmbPlayer control.
        ///     Updates the PlayerStatsRow instance and all DataGrid controls with this player's information and stats.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">
        ///     The <see cref="SelectionChangedEventArgs" /> instance containing the event data.
        /// </param>
        private void cmbPlayer_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cmbPlayer.SelectedIndex == -1)
            {
                return;
            }

            _selectedPlayerID = ((KeyValuePair<int, string>) (((cmbPlayer)).SelectedItem)).Key;

            _pbsList = new ObservableCollection<PlayerBoxScore>();

            try
            {
                _psr = new PlayerStatsRow(MainWindow.PST[_selectedPlayerID]);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Player with ID " + _selectedPlayerID + " couldn't be loaded: " + ex.Message);
                cmbPlayer.SelectedIndex = -1;
                return;
            }
            _plPSR = new PlayerStatsRow(MainWindow.PST[_selectedPlayerID], true);

            updateOverviewAndBoxScores();

            updateSplitStats();

            updateYearlyReport();

            _cumSeasonRankingsActive = PlayerRankings.CalculateActiveRankings();
            _cumSeasonRankingsPosition =
                new PlayerRankings(MainWindow.PST.Where(ps => ps.Value.Position1 == _psr.Position1)
                                             .ToDictionary(r => r.Key, r => r.Value));
            _cumSeasonRankingsTeam =
                new PlayerRankings(MainWindow.PST.Where(ps => ps.Value.TeamF == _psr.TeamF).ToDictionary(r => r.Key, r => r.Value));

            _cumPlayoffsRankingsActive = PlayerRankings.CalculateActiveRankings(true);
            _cumPlayoffsRankingsPosition =
                new PlayerRankings(
                    MainWindow.PST.Where(ps => ps.Value.Position1 == _psr.Position1).ToDictionary(r => r.Key, r => r.Value), true);
            _cumPlayoffsRankingsTeam =
                new PlayerRankings(MainWindow.PST.Where(ps => ps.Value.TeamF == _psr.TeamF).ToDictionary(r => r.Key, r => r.Value),
                                   true);

            updateScoutingReport();

            updateRecords();

            cmbOppPlayer_SelectionChanged(null, null);

            if (cmbGraphStat.SelectedIndex == -1)
            {
                cmbGraphStat.SelectedIndex = 0;
            }
        }
        /// <summary>
        ///     Handles the SelectionChanged event of the cmbOppPlayer control.
        ///     Allows the user to change the opposing player, to whose stats the current player's stats will be compared.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">
        ///     The <see cref="SelectionChangedEventArgs" /> instance containing the event data.
        /// </param>
        private void cmbOppPlayer_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                if (cmbTeam.SelectedIndex == -1 || cmbOppTeam.SelectedIndex == -1 || cmbPlayer.SelectedIndex == -1 ||
                    cmbOppPlayer.SelectedIndex == -1)
                {
                    dgvHTH.ItemsSource = null;
                    dgvHTHBoxScores.ItemsSource = null;
                    return;
                }
            }
            catch
            {
                return;
            }

            dgvHTH.ItemsSource = null;

            selectedOppPlayerID = ((KeyValuePair<int, string>) (cmbOppPlayer.SelectedItem)).Key;

            var psrList = new ObservableCollection<PlayerStatsRow>();

            _hthAllPBS = new List<PlayerBoxScore>();

            if (_selectedPlayerID == selectedOppPlayerID)
            {
                return;
            }

            if (rbHTHStatsAnyone.IsChecked.GetValueOrDefault())
            {
                _psr.Type = _psr.FirstName + " " + _psr.LastName;
                psrList.Add(_psr);

                var gameIDs = new List<int>();
                foreach (PlayerBoxScore cur in _pbsList)
                {
                    _hthAllPBS.Add(cur);
                    gameIDs.Add(cur.GameID);
                }

                ParallelQuery<PlayerBoxScore> oppPBSList =
                    MainWindow.BSHist.AsParallel()
                              .Where(bse => bse.PBSList.Any(pbs => pbs.PlayerID == selectedOppPlayerID))
                              .Select(bse => bse.PBSList.Single(pbs => pbs.PlayerID == selectedOppPlayerID))
                              .Where(pbs => !pbs.IsOut);
                foreach (PlayerBoxScore oppPBS in oppPBSList)
                {
                    if (!gameIDs.Contains(oppPBS.GameID))
                    {
                        oppPBS.AddInfoFromTeamBoxScore(MainWindow.BSHist.Single(bse => bse.BS.ID == oppPBS.GameID).BS, MainWindow.TST);
                        _hthAllPBS.Add(oppPBS);
                    }
                }

                PlayerStats oppPS = MainWindow.PST[selectedOppPlayerID];
                psrList.Add(new PlayerStatsRow(oppPS, oppPS.FirstName + " " + oppPS.LastName));
            }
            else
            {
                ParallelQuery<BoxScoreEntry> againstBSList =
                    MainWindow.BSHist.AsParallel()
                              .Where(
                                  bse =>
                                  _pbsList.Any(pbs => pbs.GameID == bse.BS.ID) &&
                                  bse.PBSList.Any(pbs => pbs.PlayerID == selectedOppPlayerID && !pbs.IsOut));

                var psOwn = new PlayerStats(_psr);
                psOwn.ResetStats();
                PlayerStats psOpp = MainWindow.PST[selectedOppPlayerID].DeepClone();
                psOpp.ResetStats();

                foreach (BoxScoreEntry bse in againstBSList)
                {
                    PlayerBoxScore pbsOwn = bse.PBSList.Single(pbs => pbs.PlayerID == psOwn.ID);
                    pbsOwn.AddInfoFromTeamBoxScore(bse.BS, MainWindow.TST);
                    PlayerBoxScore pbsOpp = bse.PBSList.Single(pbs => pbs.PlayerID == psOpp.ID);

                    psOwn.AddBoxScore(pbsOwn);
                    psOpp.AddBoxScore(pbsOpp);

                    _hthAllPBS.Add(pbsOwn);
                }

                var psrOwn = new PlayerStatsRow(psOwn);
                psrOwn.Type = psrOwn.FullNameGivenFirst;
                psrList.Add(psrOwn);
                var psrOpp = new PlayerStatsRow(psOpp);
                psrOpp.Type = psrOpp.FullNameGivenFirst;
                psrList.Add(psrOpp);
            }

            _hthAllPBS.Sort((pbs1, pbs2) => pbs2.RealDate.CompareTo(pbs1.RealDate));

            dgvHTH.ItemsSource = psrList;
            dgvHTHBoxScores.ItemsSource = _hthAllPBS;
        }
        /// <summary>
        ///     Updates the tab viewing the year-by-year overview of the player's stats.
        /// </summary>
        private void updateYearlyReport()
        {
            var psrList = new List<PlayerStatsRow>();
            var psCareer =
                new PlayerStats(new Player(_psr.ID, _psr.TeamF, _psr.LastName, _psr.FirstName, _psr.Position1, _psr.Position2));

            string qr = "SELECT * FROM PastPlayerStats WHERE PlayerID = " + _psr.ID + " ORDER BY CAST(\"SOrder\" AS INTEGER)";
            DataTable dt = _db.GetDataTable(qr);
            foreach (DataRow dr in dt.Rows)
            {
                var ps = new PlayerStats();
                bool isPlayoff = ParseCell.GetBoolean(dr, "isPlayoff");
                ps.GetStatsFromDataRow(dr, isPlayoff);
                Dictionary<string, double> tempMetrics = isPlayoff ? ps.PlMetrics : ps.Metrics;
                PlayerStats.CalculateRates(isPlayoff ? ps.PlTotals : ps.Totals, ref tempMetrics);
                string type = isPlayoff
                                  ? "Playoffs " + ParseCell.GetString(dr, "SeasonName")
                                  : "Season " + ParseCell.GetString(dr, "SeasonName");
                var curPSR = new PlayerStatsRow(ps, type, isPlayoff)
                    {
                        TeamFDisplay = ParseCell.GetString(dr, "TeamFin"),
                        TeamSDisplay = ParseCell.GetString(dr, "TeamSta")
                    };

                psrList.Add(curPSR);

                psCareer.AddPlayerStats(ps);
            }

            for (int i = 1; i <= _maxSeason; i++)
            {
                var displayNames = new Dictionary<int, string>();
                SQLiteIO.GetSeasonDisplayNames(MainWindow.CurrentDB, i, ref displayNames);
                string pT = "Players";
                if (i != _maxSeason)
                {
                    pT += "S" + i;
                }

                string q = "select * from " + pT + " where ID = " + _selectedPlayerID;
                DataTable res = _db.GetDataTable(q);
                if (res.Rows.Count == 1)
                {
                    var ps = new PlayerStats(res.Rows[0], MainWindow.TST);
                    PlayerStats.CalculateRates(ps.Totals, ref ps.Metrics);
                    var psr2 = new PlayerStatsRow(ps, "Season " + MainWindow.GetSeasonName(i));
                    psr2.TeamFDisplay = Misc.GetDisplayName(displayNames, psr2.TeamF);
                    psr2.TeamSDisplay = Misc.GetDisplayName(displayNames, psr2.TeamS);
                    psrList.Add(psr2);
                    psCareer.AddPlayerStats(ps);
                }

                pT = "PlayoffPlayers";
                if (i != _maxSeason)
                {
                    pT += "S" + i;
                }

                q = "select * from " + pT + " where ID = " + _selectedPlayerID;
                res = _db.GetDataTable(q);
                if (res.Rows.Count == 1)
                {
                    var ps = new PlayerStats(res.Rows[0], MainWindow.TST, true);
                    if (ps.PlTotals[PAbbr.GP] > 0)
                    {
                        PlayerStats.CalculateRates(ps.PlTotals, ref ps.PlMetrics);
                        var psr2 = new PlayerStatsRow(ps, "Playoffs " + MainWindow.GetSeasonName(i), true);
                        psr2.TeamFDisplay = Misc.GetDisplayName(displayNames, psr2.TeamF);
                        psr2.TeamSDisplay = Misc.GetDisplayName(displayNames, psr2.TeamS);
                        psrList.Add(psr2);
                        psCareer.AddPlayerStats(ps, true);
                    }
                }
            }

            PlayerStats.CalculateRates(psCareer.Totals, ref psCareer.Metrics);
            psrList.Add(new PlayerStatsRow(psCareer, "Career", "Career"));

            var psrListCollection = new ListCollectionView(psrList);
            Debug.Assert(psrListCollection.GroupDescriptions != null, "psrListCollection.GroupDescriptions != null");
            psrListCollection.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
            dgvYearly.ItemsSource = psrListCollection;
        }
 public static void Refresh(ref PlayerStatsRow psr)
 {
     psr = new PlayerStatsRow(new PlayerStats(psr));
 }
Example #15
0
 public PlayerStats ConvertToMyLeagueLeader(Dictionary<int, TeamStats> teamStats, bool playoffs = false)
 {
     var newpsr = new PlayerStatsRow(this, playoffs, calcRatings: false).ConvertToMyLeagueLeader(teamStats, playoffs);
     return new PlayerStats(newpsr, playoffs);
 }
 /// <summary>
 ///     Tries to parse the specified dictionary and update the specified PlayerStatsRow instance.
 /// </summary>
 /// <param name="psr">The PSR.</param>
 /// <param name="dict">The dict.</param>
 public static void TryChangePSR(ref PlayerStatsRow psr, Dictionary<string, string> dict)
 {
     psr.GP = psr.GP.TrySetValue(dict, "GP", typeof (UInt16));
     psr.GS = psr.GS.TrySetValue(dict, "GS", typeof (UInt16));
     psr.MINS = psr.MINS.TrySetValue(dict, "MINS", typeof (UInt16));
     psr.PTS = psr.PTS.TrySetValue(dict, "PTS", typeof (UInt16));
     psr.FGM = psr.FGM.TrySetValue(dict, "FGM", typeof (UInt16));
     psr.FGA = psr.FGA.TrySetValue(dict, "FGA", typeof (UInt16));
     psr.TPM = psr.TPM.TrySetValue(dict, "3PM", typeof (UInt16));
     psr.TPA = psr.TPA.TrySetValue(dict, "3PA", typeof (UInt16));
     psr.FTM = psr.FTM.TrySetValue(dict, "FTM", typeof (UInt16));
     psr.FTA = psr.FTA.TrySetValue(dict, "FTA", typeof (UInt16));
     psr.REB = psr.REB.TrySetValue(dict, "REB", typeof (UInt16));
     psr.OREB = psr.OREB.TrySetValue(dict, "OREB", typeof (UInt16));
     psr.DREB = psr.DREB.TrySetValue(dict, "DREB", typeof (UInt16));
     psr.AST = psr.AST.TrySetValue(dict, "AST", typeof (UInt16));
     psr.TOS = psr.TOS.TrySetValue(dict, "TO", typeof (UInt16));
     psr.STL = psr.STL.TrySetValue(dict, "STL", typeof (UInt16));
     psr.BLK = psr.BLK.TrySetValue(dict, "BLK", typeof (UInt16));
     psr.FOUL = psr.FOUL.TrySetValue(dict, "FOUL", typeof (UInt16));
 }
        private void updateGraph()
        {
            if (cmbGraphStat.SelectedIndex == -1 || cmbGraphInterval.SelectedIndex == -1 || cmbTeam.SelectedIndex == -1
                || cmbPlayer.SelectedIndex == -1)
            {
                clearGraph();
                return;
            }
            var intervalItem = cmbGraphInterval.SelectedItem.ToString();
            var yearlyStats = _yearlyPSRList.Where(psr => psr.Type.StartsWith("Season ")).ToList();
            var monthlyStats = MainWindow.SplitPlayerStats[_psr.ID].Where(pair => pair.Key.StartsWith("M ")).ToList();

            int count;
            Intervals interval;
            switch (intervalItem)
            {
                case "Every Game":
                    interval = Intervals.EveryGame;
                    count = _pbsListWithOut.Count;
                    break;
                case "Monthly":
                    interval = Intervals.Monthly;
                    count = monthlyStats.Count;
                    break;
                case "Yearly":
                    interval = Intervals.Yearly;
                    count = yearlyStats.Count;
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            if (count < 2)
            {
                clearGraph();
                return;
            }

            var propToGet = cmbGraphStat.SelectedItem.ToString();
            propToGet = propToGet.Replace('3', 'T');
            propToGet = propToGet.Replace('%', 'p');
            propToGet = propToGet.Replace("TO", "TOS");

            double sum = 0;
            double games = 0;

            chart.Primitives.Clear();
            var cp = new ChartPrimitive { Label = cmbGraphStat.SelectedItem.ToString(), ShowInLegend = false };

            switch (interval)
            {
                case Intervals.EveryGame:
                    var orderedPBSList = _pbsListWithOut.OrderBy(pbs => pbs.RealDate).ToList();
                    for (var i = 0; i < orderedPBSList.Count; i++)
                    {
                        var pbs = orderedPBSList[i];
                        if (pbs.IsOut)
                        {
                            if (cp.Points.Count > 0)
                            {
                                chart.Primitives.Add(cp.CustomClone());
                                cp = new ChartPrimitive { Label = cmbGraphStat.SelectedItem.ToString(), ShowInLegend = false };
                            }
                            continue;
                        }
                        var value = Convert.ToDouble(typeof(PlayerBoxScore).GetProperty(propToGet).GetValue(pbs, null));
                        if (double.IsNaN(value))
                        {
                            continue;
                        }
                        if (propToGet.Contains("p"))
                        {
                            value = Convert.ToDouble(Convert.ToInt32(value * 1000)) / 1000;
                        }
                        cp.AddPoint(i + 1, value);
                        games++;
                        sum += value;
                    }
                    break;
                case Intervals.Monthly:
                case Intervals.Yearly:
                    if (interval == Intervals.Monthly)
                    {
                        monthlyStats = monthlyStats.OrderBy(ms => ms.Key).ToList();
                    }
                    if (PlayerStatsHelper.TotalsToPerGame.ContainsKey(propToGet))
                    {
                        propToGet = PlayerStatsHelper.TotalsToPerGame[propToGet];
                    }
                    for (var i = 0; i < count; i ++)
                    {
                        var ps = interval == Intervals.Monthly ? monthlyStats[i].Value : new PlayerStats(yearlyStats[i]);
                        if (ps.Totals[PAbbrT.GP] == 0)
                        {
                            if (cp.Points.Count > 0)
                            {
                                chart.Primitives.Add(cp.CustomClone());
                                cp = new ChartPrimitive { Label = cmbGraphStat.SelectedItem.ToString(), ShowInLegend = false };
                            }
                            continue;
                        }
                        var dummyTs = new TeamStats();
                        ps.CalcMetrics(dummyTs, dummyTs, dummyTs, GmScOnly: true);
                        var psr = new PlayerStatsRow(ps, calcRatings: false);
                        var value = psr.GetValue<double>(propToGet);
                        if (double.IsNaN(value))
                        {
                            continue;
                        }
                        if (propToGet.Contains("p"))
                        {
                            value = Convert.ToDouble(Convert.ToInt32(value * 1000)) / 1000;
                        }
                        cp.AddPoint(i + 1, value);
                        games++;
                        sum += value;
                    }
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            if (cp.Points.Count > 0)
            {
                chart.Primitives.Add(cp.CustomClone());
            }
            if (chart.Primitives.Count > 0 && chart.Primitives.Sum(p => p.Points.Count) > 1)
            {
                if (PlayerStatsHelper.TotalsToPerGame.ContainsKey(propToGet))
                {
                    propToGet = PlayerStatsHelper.TotalsToPerGame[propToGet];
                }
                double average;
                switch (interval)
                {
                    case Intervals.EveryGame:
                    case Intervals.Monthly:
                        average = _psr.GetValue<double>(propToGet);
                        break;
                    case Intervals.Yearly:
                        average = _yearlyPSRList.Last().GetValue<double>(propToGet);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
                //var average = sum / games;
                var cpavg = new ChartPrimitive();
                for (var i = 0; i < count; i++)
                {
                    cpavg.AddPoint(i + 1, average);
                }
                cpavg.Color = Color.FromRgb(0, 0, 100);
                cpavg.Dashed = true;
                cpavg.ShowInLegend = false;

                var cp2 = new ChartPrimitive();
                cp2.AddPoint(chart.Primitives.First().Points.First().X, 0);
                cp2.AddPoint(chart.Primitives.Last().Points.Last().X, 1);

                chart.Primitives.Add(cpavg);
                chart.RedrawPlotLines();
                chart.Primitives.Add(cp2);
            }
            else
            {
                chart.RedrawPlotLines();
                var cp2 = new ChartPrimitive();
                cp2.AddPoint(1, 0);
                cp2.AddPoint(2, 1);
                chart.Primitives.Add(cp2);
            }
            chart.ResetPanAndZoom();
        }