private ProbablePitcherViewModel GetProbablePitchers(
            DateTime gameDate)
        {
            var pitchers = _pitcherRepository.Submit(
                gameDate,
                homeOnly: PickerOptions.OptionOn(
                    Constants.Options.HomePitchersOnly));

#if DEBUG
            var lines = pitchers.Dump();
            LogLines(lines);
#endif
            if (pitchers.ProbablePitchers.Count == 0)
            {
                _logger.Info($"No games scheduled for {gameDate.ToShortDateString()}");
            }
            foreach (var pitcher in pitchers.ProbablePitchers)
            {
                if (pitcher.TeamId == null)
                {
                    pitcher.TeamId = pitcher.TeamSlug;
                }
                if (pitcher.TeamSlug == null)
                {
                    pitcher.TeamSlug = pitcher.TeamId;
                }

                var oba = _calculateOpponentOba.CalculateOba(
                    pitcher.Slug,
                    gameDate,
                    PickerOptions.IntegerOption(
                        Constants.Options.PitcherDaysBack));
                if (oba > 0.0M)
                {
#if DEBUG
                    _logger.Trace($@"pitcher {
						pitcher.Slug
						} oba changed to {
						oba
						} from {
						pitcher.OpponentsBattingAverage
						}"                        );
#endif
                    pitcher.OpponentsBattingAverage = oba;
                }
            }
            pitchers.ProbablePitchers
                = pitchers.ProbablePitchers.OrderByDescending(
                      o => o.OpponentsBattingAverage).ToList();
#if DEBUG
            lines = pitchers.Dump();
            LogLines(lines);
#endif
            return(pitchers);
        }
        private List <Selection> SelectBatters(
            DateTime gameDate,
            int numberRequired)
        {
            var batters = new List <Selection>();
            ProbablePitcherViewModel pitchers = GetProbablePitchers(
                gameDate);
            var lines = pitchers.Dump();

            LogLines(lines);
            var i = 0;

            foreach (var pitcher in pitchers.ProbablePitchers)
            {
                if (pitcher.OpponentsBattingAverage < PickerOptions.DecimalOption(
                        Constants.Options.PitchersMendozaLine))
                {
#if DEBUG
                    Log($"Pitcher {pitcher} has too good a Opp B Avg");
#endif
                    continue;
                }
                if (PickerOptions.OptionOn(Constants.Options.TeamClip))
                {
                    var pitchersTeamClip = TeamClip(
                        statsDate: gameDate.AddDays(-1),
                        teamName: pitcher.TeamId);
                    if (pitchersTeamClip > PickerOptions.DecimalOption(
                            Constants.Options.PitchersTeamMendozaLine))
                    {
#if DEBUG
                        Log($"Pitchers Team {pitcher.TeamName} has too good a Clip {pitchersTeamClip}");
#endif
                        continue;
                    }
                    var battersTeamClip = TeamClip(
                        statsDate: gameDate.AddDays(-1),
                        teamName: pitcher.OpponentSlug);
                    if (battersTeamClip < PickerOptions.DecimalOption(
                            Constants.Options.BattersTeamMendozaLine))
                    {
#if DEBUG
                        Log($@"Batters Team {
							pitcher.OpponentSlug
							} has not got a good enough Clip {
							battersTeamClip
							}"                            );
#endif
                        continue;
                    }
                }
                ++i;
                var printLine = $"{i.ToString(),2} {pitcher}";
#if DEBUG
                Log($"Looking for a {pitcher.OpponentSlug} batter facing {pitcher}");
#endif
                var lineupQueryDate          = gameDate.AddDays(-1);
                var lineupPositionsToExamine = PickerOptions.IntegerOption(
                    Constants.Options.LineupPositions);

                var opponents = _lineupProjector.ProjectLineup(
                    pitcher,
                    lineupQueryDate,
                    lineupPositionsToExamine);

                if (opponents.Lineup.Count.Equals(0))
                {
#if DEBUG
                    Log("  cold team - skip this pitcher");
#endif
                    continue;                      //  cold team
                }
#if DEBUG
                opponents.DumpLineup();
#endif
                var batter1 = opponents.BattingAt("1");
                var batter2 = new Batter();
                var batter3 = new Batter();
                var batter4 = new Batter();

                if (lineupPositionsToExamine > 1)
                {
                    batter2 = opponents.BattingAt("2");
                    if (lineupPositionsToExamine > 2)
                    {
                        batter3 = opponents.BattingAt("3");
                    }
                    if (lineupPositionsToExamine > 3)
                    {
                        batter4 = opponents.BattingAt("4");
                    }
                }
                if (batter1 != null)
                {
                    var selection = new Selection
                    {
                        GameDate = gameDate,
                        Batter1  = batter1,
                        Batter2  = batter2,
                        Batter3  = batter3,
                        Batter4  = batter4,
                        Pitcher  = pitcher,
                        Game     = new Game
                        {
                            Title = pitcher.NextOpponent
                        }
                    };
                    //  additive
                    var    like   = true;
                    string reason = string.Empty;
                    foreach (var test in Tests)
                    {
                        if (!test.Likes(selection, out reason))
                        {
                            printLine += reason;
                            like       = false;
#if DEBUG
                            Log($"{selection} no good :- {reason}");
#endif
                            break;                              // one strike and ur out
                        }
                    }
                    if (like)
                    {
                        batters.Add(selection);
#if DEBUG
                        Log($"{selection} good");
#endif
                        printLine += "  " + selection.Batter.ToString();
                    }
                }
                else
                {
                    printLine +=
                        $@"  skipped No {
                            pitcher.OpponentSlug
                            } lineups available for {
                            lineupQueryDate.ToShortDateString()
                            } team COLD";
                }

                if (batters.Count == numberRequired)
                {
                    break;
                }
            }
            return(batters);
        }