public override IEnumerable<TeamRecommendation> Analyse(Player player, Fixture fixture, SimulationContext context)
        {
            var res = new TeamRecommendation();
            res.Type = TeamRecommendationType.HomeTeamAdvantage;

            var playerTeam = player.GetLeagueTeam(fixture);
            if (fixture.HomeTeam.Team.ID == playerTeam.Team.ID ||
                player.HasHomeTeamAdvantage(fixture))
            {
                res.Points = PointsWhenHomeTeam;
            }
            else if (fixture.AwayTeam.Team.ID == player.Team.ID)
            {
                res.Points = PointsWhenAwayTeam;
            }
            yield return res;
        }
        public override IEnumerable<TeamRecommendation> Analyse(Player player, Fixture fixture, SimulationContext context)
        {
            if (PointMapper == null)
                throw new ArgumentException("Invalid property", nameof(PointMapper));
            if (EloProvider == null)
                throw new ArgumentException("Invalid property", nameof(EloProvider));

            var res = new TeamRecommendation();
            res.Type = TeamRecommendationType.FixtureOdds;

            var playerTeam = player.GetLeagueTeam(fixture);
            var opposingTeam = player.GetOpposingTeam(fixture);
            if (playerTeam == null || opposingTeam == null)
            {
                _log.Warn($"Invalid teams");
                yield break;
            }

            var playerTeamEloRating = EloProvider.GetRating(fixture.Time, player.Team).WaitForResult();
            var opposingTeamEloRating = EloProvider.GetRating(fixture.Time, opposingTeam.Team).WaitForResult();
            if (playerTeamEloRating == null)
            {
                _log.Warn($"Could not get elo rating for team {playerTeam.Team.Name} @{fixture.Time}");
                yield break;
            }
            if (opposingTeamEloRating == null)
            {
                _log.Warn($"Could not get elo rating for team {opposingTeam.Team.Name} @{fixture.Time}");
                yield break;
            }

            float diff = playerTeamEloRating.Rating - opposingTeamEloRating.Rating;
            float diffPercentage = diff / playerTeamEloRating.Rating;

            var valueMap = new ValueMap();
            valueMap[ValueMapKeys.EloRatingPlayerTeam] = playerTeamEloRating.Rating;
            valueMap[ValueMapKeys.EloRatingOpposingTeam] = opposingTeamEloRating.Rating;
            valueMap[ValueMapKeys.EloRatingTeamDifferance] = diff;
            valueMap[ValueMapKeys.EloRatingTeamDifferancePercentage] = diffPercentage;

            res.Points = PointMapper.Test(valueMap).Sum(x => x.Points);
            yield return res;
        }
        public override IEnumerable<TeamRecommendation> Analyse(Player player, Fixture fixture, SimulationContext context)
        {
            if (PointMapper == null)
                throw new ArgumentException("Invalid property", nameof(PointMapper));

            var res = new TeamRecommendation();
            res.Type = TeamRecommendationType.FixtureOdds;

            var playerTeam = player.GetLeagueTeam(fixture);

            var valueMap = new ValueMap();
            if (fixture.Odds == null)
            {
                _log.Info($"No odds for fixture {fixture.HomeTeam.Team.ShortName} vs {fixture.AwayTeam.Team.ShortName} (GW #{fixture.Gameweek.Number}, cannot continue analyse");
                yield break;
            }
            else if (fixture.HomeTeam.Team.ID == playerTeam.Team.ID)
            {
                valueMap["odds-win"] = fixture.Odds.HomeWin.Value;
                valueMap["odds-draw"] = fixture.Odds.Draw.Value;
                valueMap["odds-loss"] = fixture.Odds.AwayWin.Value;
            }
            else if (fixture.AwayTeam.Team.ID == player.Team.ID)
            {
                valueMap["odds-win"] = fixture.Odds.AwayWin.Value;
                valueMap["odds-draw"] = fixture.Odds.Draw.Value;
                valueMap["odds-loss"] = fixture.Odds.HomeWin.Value;
            }
            else
            {
                _log.Warn($"Player '{player.DisplayName}' doesn't play for any of the fixture teams: {fixture.HomeTeam.Team.ShortName} vs {fixture.AwayTeam.Team.ShortName} (GW #{fixture.Gameweek.Number}");
                yield break;
            }

            res.Points = PointMapper.Test(valueMap).Sum(x => x.Points);
            yield return res;
        }
 public void AddRecommendation(TeamRecommendation recommendation)
 {
     TeamRecommendations.Add(recommendation);
 }