public void AddMatchToLeaderboard(LeaderboardView leaderboardView, Match match)
        {
            var leaderboardEntries = leaderboardView.Entries;

            //Team1
            var player1 = match.PlayerList[0];
            var existingPlayer1 = leaderboardEntries.SingleOrDefault(x => x.UserName == player1);
            var player2 = match.PlayerList[1];
            var existingPlayer2 = leaderboardEntries.SingleOrDefault(x => x.UserName == player2);

            var team1AvgElo = existingPlayer1 != null ? existingPlayer1.EloRating : 1500;
            team1AvgElo += existingPlayer2 != null ? existingPlayer2.EloRating : 1500;

            //Team2
            var player3 = match.PlayerList[2];
            var existingPlayer3 = leaderboardEntries.SingleOrDefault(x => x.UserName == player3);
            var player4 = match.PlayerList[3];
            var existingPlayer4 = leaderboardEntries.SingleOrDefault(x => x.UserName == player4);

            var team2AvgElo = existingPlayer3 != null ? existingPlayer3.EloRating : 1500;
            team2AvgElo += existingPlayer4 != null ? existingPlayer4.EloRating : 1500;

            var elo = new EloRating();
            var result = elo.CalculateRating(team1AvgElo/2, team2AvgElo/2, match.MatchResult.Team1Won);

            match.Points = (int)result;

            if (existingPlayer1 == null)
            {
                leaderboardEntries.Add(CreatePlayer(player1, match, result, match.MatchResult.Team1Won));
            }
            else
            {
                UpdateExistingLeaderboardEntry(existingPlayer1.UserName, leaderboardEntries, match, result,
                    match.MatchResult.Team1Won);
            }

            if (existingPlayer2 == null)
            {
                leaderboardEntries.Add(CreatePlayer(player2, match, result, match.MatchResult.Team1Won));
            }
            else
            {
                UpdateExistingLeaderboardEntry(existingPlayer2.UserName, leaderboardEntries, match, result,
                    match.MatchResult.Team1Won);
            }

            if (existingPlayer3 == null)
            {
                leaderboardEntries.Add(CreatePlayer(player3, match, result, !match.MatchResult.Team1Won));
            }
            else
            {
                UpdateExistingLeaderboardEntry(existingPlayer3.UserName, leaderboardEntries, match, result,
                    !match.MatchResult.Team1Won);
            }

            if (existingPlayer4 == null)
            {
                leaderboardEntries.Add(CreatePlayer(player4, match, result, !match.MatchResult.Team1Won));
            }
            else
            {
                UpdateExistingLeaderboardEntry(existingPlayer4.UserName, leaderboardEntries, match, result,
                    !match.MatchResult.Team1Won);
            }
        }
        public LeaderboardView RecalculateLeaderboard()
        {
            var matches = _matchRepository.GetMatches().OrderBy(x => x.TimeStampUtc);
            var leaderboardView = new LeaderboardView();

            foreach (var match in matches)
            {
                AddMatchToLeaderboard(leaderboardView, match);
                _matchRepository.SaveMatch(match);
            }
            leaderboardView.Entries = leaderboardView.Entries.OrderByDescending(x => x.EloRating).ToList();

            _leaderboardViewRepository.SaveLeaderboardView(leaderboardView);
            return leaderboardView;
        }