public YahooScorer(NFLWeek week)
 {
     Name             = "Yahoo Scorer";
     Week             = week;
     PgmDao           = new DbfPlayerGameMetricsDao();    //   should be injected
     YahooStatService = new YahooStatService();
     Logger           = LogManager.GetCurrentClassLogger();
     UseProjections   = true;
 }
        public Decimal RatePlayer(
            NFLPlayer plyr,
            NFLWeek week,
            bool takeCache = true)
        {
            // Points for Scores and points for stats
            if (week.WeekNo.Equals(0))
            {
                return(0);
            }

            //TODO:  factor in known suspensions
            //if (IsSuspended(plyr, week))
            //	return 0;

            if (takeCache)
            {
                //  Check the stats service first
                if (YahooStatService.IsStat(
                        plyr.PlayerCode,
                        week.Season,
                        week.Week))
                {
                    return(YahooStatService.GetStat(
                               plyr.PlayerCode,
                               week.Season,
                               week.Week));
                }
            }

            if (plyr.TeamCode == null)
            {
                Logger.Error("{0} has a null teamcode", plyr);
                return(0);
            }
            GameKey = Week.GameCodeFor(plyr.TeamCode);                //  slow?
            if (string.IsNullOrEmpty(GameKey))
            {
                return(0);
            }

            Game          = new NFLGame(GameKey);
            WeekHasPassed = Game.Played(addDay: false);
            if (!WeekHasPassed)
            {
                return(plyr.Points);
            }

            Week        = week;       //  set the global week, other wise u will get the same week all the time
            plyr.Points = 0;          //  start from scratch

            #region Passing

            //  4 pts for a Tdp
            var tdpPts = PointsFor(plyr, 4, Constants.K_SCORE_TD_PASS, id: "2");
            plyr.Points += tdpPts;

            Announce($"{plyr.PlayerName} has {tdpPts} points for Tdp");

            //  2 pts for a PAT pass
            var ptsForPATpasses = PointsFor(plyr, 2, Constants.K_SCORE_PAT_PASS, id: "2");
            plyr.Points += ptsForPATpasses;

            Announce($"{plyr.PlayerName} has {ptsForPATpasses} points for PAT passes");

            //  1 pt / 25 YDp
            var ptsForYDp = PointsForStats(plyr: plyr, increment: 1, forStatType: Constants.K_STATCODE_PASSING_YARDS, divisor: 25.0M);
            plyr.Points += ptsForYDp;

            Announce($"{plyr.PlayerName} has {ptsForYDp} points for {plyr.ProjectedYDp} YDp");

            //  -2 pts for an Interception
            var ptsForInts = PointsForStats(
                plyr: plyr, increment: -1, forStatType: Constants.K_STATCODE_INTERCEPTIONS_THROWN, divisor: 1.0M);
            plyr.Points += ptsForInts;

            Announce($"{plyr.PlayerName} has {ptsForInts} points for Interceptions");

            #endregion Passing

            #region Catching

            //  6 pts for a TD catch
            var ptsForTDcatches = PointsFor(
                plyr: plyr,
                increment: 6,
                forScoreType: Constants.K_SCORE_TD_PASS,
                id: "1");
            plyr.Points += ptsForTDcatches;
            //  2 points for a 2 point conversion
            var ptsForPATcatches = PointsFor(
                plyr: plyr,
                increment: 2,
                forScoreType: Constants.K_SCORE_PAT_PASS,
                id: "1");
            plyr.Points += ptsForPATcatches;

            Announce($@"{
				plyr.PlayerName
				} has {
				ptsForPATcatches
				} points for PAT catches"                );

            //  1 pt / 10 yds
            var ptsForYDs = PointsForStats(
                plyr: plyr,
                increment: 1,
                forStatType: Constants.K_STATCODE_RECEPTION_YARDS,
                divisor: 10.0M);

            plyr.Points += ptsForYDs;

            Announce($"{plyr.PlayerName} has {ptsForYDs} points for YDc");

            //  1/2 pt / 10 yds
            var ptsForRecs = PointsForStats(
                plyr: plyr,
                increment: 1,
                forStatType: Constants.K_STATCODE_PASSES_CAUGHT,
                divisor: 2.0M);

            plyr.Points += ptsForRecs;

            Announce($"{plyr.PlayerName} has {ptsForRecs} points for REC");

            #endregion Catching

            #region Running

            //  6 points for TD run
            var ptsForTDruns = PointsFor(plyr, 6, Constants.K_SCORE_TD_RUN, id: "1");
            plyr.Points += ptsForTDruns;

            Announce($"{plyr.PlayerName} has {ptsForTDruns} points for TD runs");

            var ptsForPaTruns = PointsFor(plyr, 2, Constants.K_SCORE_PAT_RUN, id: "1");
            plyr.Points += ptsForPaTruns;

            Announce($"{plyr.PlayerName} has {ptsForPaTruns} points for PAT runs");

            //  1 pt / 10 yds
            var ptsForYDr = PointsForStats(
                plyr: plyr, increment: 1, forStatType: Constants.K_STATCODE_RUSHING_YARDS, divisor: 10.0M);
            plyr.Points += ptsForYDr;

            Announce($"{plyr.PlayerName} has {ptsForYDr} points for YDr");

            #endregion Running

            #region Kicking

            plyr.Points += PointsFor(plyr, 3, Constants.K_SCORE_FIELD_GOAL, "1");

            plyr.Points += PointsFor(plyr, 1, Constants.K_SCORE_PAT, "1");

            #endregion Kicking

            Announce($@"{
				plyr.PlayerName
				} has {
				plyr.Points
				} in week {
				week.Season
				}:{
				week.Week
				}"                );
            return(plyr.Points);
        }