private FixtureRating SetupFixtureRating(Fixture fixture)
        {
            FixtureRating fixtureRating = new FixtureRating(fixture);

            fixtureRating.HomeSuperiority = GetSuperiority(fixture.HomeTeam, true);
            fixtureRating.AwaySuperiority = GetSuperiority(fixture.AwayTeam, false);

            var matchedResults  = analysis.Where(x => x.Division == fixture.Division && x.MatchRating == fixtureRating.MatchRating).ToList();
            var previousResults = analysis.Where(x => x.HomeTeam == fixture.HomeTeam && x.AwayTeam == fixture.AwayTeam && x.Date <fixture.Date && x.Date> fixture.Date.AddYears(-5)).OrderByDescending(x => x.Date).Take(5).ToList();

            matchedResults.AddRange(previousResults);
            matchedResults.AddRange(previousResults);
            matchedResults.AddRange(previousResults);

            if (matchedResults.Count > 0)
            {
                fixtureRating.HomePercent = decimal.Divide(matchedResults.Where(x => x.Actual == "H").Count(), matchedResults.Count);
                fixtureRating.DrawPercent = decimal.Divide(matchedResults.Where(x => x.Actual == "D").Count(), matchedResults.Count);
                fixtureRating.AwayPercent = decimal.Divide(matchedResults.Where(x => x.Actual == "A").Count(), matchedResults.Count);

                fixtureRating.BothTeamsScoreYesPercent = decimal.Divide(matchedResults.Where(x => x.BothTeamsScored).Count(), matchedResults.Count);
                fixtureRating.BothTeamsScoreNoPercent  = decimal.Divide(matchedResults.Where(x => !x.BothTeamsScored).Count(), matchedResults.Count);

                fixtureRating.TwoGoalsYesPercent = decimal.Divide(matchedResults.Where(x => x.TwoGoals).Count(), matchedResults.Count);
                fixtureRating.TwoGoalsNoPercent  = decimal.Divide(matchedResults.Where(x => !x.TwoGoals).Count(), matchedResults.Count);

                fixtureRating.ThreeGoalsYesPercent = decimal.Divide(matchedResults.Where(x => x.ThreeGoals).Count(), matchedResults.Count);
                fixtureRating.ThreeGoalsNoPercent  = decimal.Divide(matchedResults.Where(x => !x.ThreeGoals).Count(), matchedResults.Count);
            }

            fixtureRating.Valid = matchedResults.Count > validThreshold ? true : false;

            if (test)
            {
                fixtureRating.Actual           = fixture.Actual;
                fixtureRating.ActualBTTS       = fixture.ActualBTTS;
                fixtureRating.ActualTwoGoals   = fixture.ActualTwoGoals;
                fixtureRating.ActualThreeGoals = fixture.ActualThreeGoals;
            }

            return(fixtureRating);
        }
        public List <FixtureRating> Calculate(bool test = false, bool reset = false)
        {
            try
            {
                this.test = test;

                if (reset)
                {
                    DeleteAnalysis();
                    RunAnalysis();
                }

                List <FixtureRating> fixtureRatings = new List <FixtureRating>();

                if (!test)
                {
                    var current = DateTime.Now.Date;

                    fixtures = db.Fixtures.AsNoTracking().Where(x => x.Date >= current).OrderBy(x => x.Date).ThenBy(x => x.Division).ThenBy(x => x.HomeTeam).ToList();
                }
                else
                {
                    SetupTestFixtures();
                }

                analysis = db.Datasets.AsNoTracking().ToList();

                for (int i = 0; i < fixtures.Count; i++)
                {
                    FixtureRating fixtureRating = SetupFixtureRating(fixtures[i]);
                    fixtureRatings.Add(fixtureRating);
                }

                return(fixtureRatings);
            }
            catch (Exception ex)
            {
                log.Error("Error calculating fixtures", ex);
                throw;
            }
        }