public async Task <PlayerProfileView> GetPlayerProfileAsync(Guid userId)
        {
            var seasonsTask      = _seasonInfoRepository.GetAllSeasonsAsync();
            var summonerTask     = _summonerInfoRepository.ReadOneByUserIdAsync(userId);
            var achievementsTask = _achievementRepository.GetAchievementsForUserAsync(userId);

            var summoner = await summonerTask;

            if (summoner == null)
            {
                var message = $"User {userId} was not found.";
                _logger.LogError(message);
                throw new SummonerInfoException($"User {userId} was not found.");
            }
            var achievements = await achievementsTask;

            var alternateAccountsTask = _alternateAccountRepository.ReadAllForSummonerAsync(summoner.Id);
            var teamPlayer            = (await _teamPlayerRepository.GetAllRostersForPlayerAsync(summoner.Id)).ToList();

            var seasons = (await seasonsTask).OrderBy(x => x.SeasonStartDate).ToList();

            var alternateAccounts = await alternateAccountsTask;
            var altAccountsMapped = _alternateAccountMapper.Map(alternateAccounts);
            var achievementViews  = new List <AchievementView>();

            foreach (var achievement in achievements)
            {
                var achievementView = new AchievementView(achievement);
                var seasonAchieved  = seasons.FirstOrDefault(x =>
                                                             x.SeasonStartDate <achievement.AchievedDate &&
                                                                                (x.SeasonEndDate ?? DateTime.MaxValue)> achievement.AchievedDate);
                achievementView.Season = seasonAchieved != null ? seasonAchieved.SeasonName : "PreSeason";
                achievementViews.Add(achievementView);
            }
            var playerStatsDictionary = new Dictionary <int, PlayerStatsView>();
            var matchDetails          = await _matchDetailRepository.GetMatchDetailsForPlayerAsync(new List <Guid> {
                summoner.Id
            });

            var statIds = matchDetails.Values.SelectMany(x => x.Select(y => y.PlayerStatsId));

            var allPlayerStats = await _playerStatsRepository.GetStatsAsync(statIds);

            var teamname = "None";

            if (teamPlayer.Any())
            {
                var latestSeason = seasons.Last();
                var team         = await _teamRosterRepository.GetTeamAsync(latestSeason.Id, teamPlayer.Select(x => x.TeamRosterId));

                if (team != null)
                {
                    teamname = team.TeamName;
                }
            }
            foreach (var seasonKvp in allPlayerStats)
            {
                var season      = seasons.First(x => x.Id == seasonKvp.Key.SeasonId);
                var seasonStats = allPlayerStats.SelectMany(x => x.Value.Where(y => y.SeasonInfoId == season.Id));
                var mappedStats = _playerStatsMapper.MapForSeason(seasonStats, 0);
                if (int.TryParse(season.SeasonName.Split(" ").Last(), out var seasonNum))
                {
                    playerStatsDictionary.Add(seasonNum, mappedStats);
                }
            }
            var view = new PlayerProfileView
            {
                PlayerName            = summoner.SummonerName,
                Rank                  = _tierDivisionMapper.Map(summoner.Tier_DivisionId),
                TeamName              = string.IsNullOrEmpty(teamname) ? "None" : teamname,
                Achievements          = achievementViews,
                PlayerStats           = playerStatsDictionary,
                AlternateAccountViews = altAccountsMapped
            };

            if (summoner.PreviousSeasonRankId != null)
            {
                view.PreviousSeasonRank = _tierDivisionMapper.Map(summoner.PreviousSeasonRankId.Value);
            }

            return(view);
        }
        /// <summary>
        /// For Roster specific View
        /// </summary>
        /// <param name="rosterId"></param>
        /// <returns></returns>
        public async Task <RosterView> GetRosterAsync(Guid rosterId)
        {
            var seasonInfo = await _seasonInfoRepository.GetCurrentSeasonAsync();

            var alternateAccountsTask = _alternateAccountRepository.ReadAllAsync();
            var rosterTask            = _teamRosterRepository.GetByTeamIdAsync(rosterId);
            var captainTask           = _teamCaptainRepository.GetCaptainByRosterId(rosterId);
            var playersSummoner       = (await _teamPlayerRepository.ReadAllForRosterAsync(rosterId)).ToList();
            var summonersTask         = _summonerInfoRepository.GetAllForSummonerIdsAsync(playersSummoner.Select(x => x.SummonerId));
            var matchDetails          = await _matchDetailRepository.GetMatchDetailsForPlayerAsync(playersSummoner.Select(x => x.SummonerId));

            var schedule = (await GetTeamSchedule(rosterId)).ToList();

            matchDetails = matchDetails.Where(x => x.Key.SeasonId == seasonInfo.Id).ToDictionary(x => x.Key, x => x.Value);
            var scheduleIds = schedule.Select(x => x.ScheduleId).ToList();

            var statIds = matchDetails.Values.SelectMany(x => x.Where(z => z.SeasonInfoId == seasonInfo.Id && scheduleIds.Contains(z.TeamScheduleId)).Select(y => y.PlayerStatsId));

            var mappedStats = await SetupPlayerStatsViews(statIds, schedule, matchDetails);

            var alternateAccounts = (await alternateAccountsTask).ToList();
            var summoners         = (await summonersTask).ToList();

            var summonerViews = _summonerMapper.MapDetailed(summoners, alternateAccounts, mappedStats).ToList();

            var divisions = (await _divisionRepository.GetAllForSeasonAsync(seasonInfo.Id)).ToList();
            var captain   = await captainTask;
            var roster    = await rosterTask;

            foreach (var teamPlayerEntity in playersSummoner)
            {
                var player = summoners.First(x => x.Id == teamPlayerEntity.SummonerId);

                var isSub        = teamPlayerEntity.IsSub ?? false;
                var summonerView = summonerViews.First(x => x.SummonerName == player.SummonerName);
                summonerView.IsSub = isSub;
            }

            var division = divisions.First(x =>
                                           x.LowerLimit <= roster.TeamTierScore && x.UpperLimit >= roster.TeamTierScore);
            var rosterView = new RosterView
            {
                RosterId      = roster.Id,
                Captain       = summoners.FirstOrDefault(x => x.Id == captain?.SummonerId)?.SummonerName,
                TeamName      = roster.TeamName,
                Wins          = roster.Wins ?? 0,
                Loses         = roster.Loses ?? 0,
                Players       = summonerViews,
                TeamTierScore = roster.TeamTierScore.GetValueOrDefault(),
                Division      = new DivisionView
                {
                    DivisionName     = division.Name,
                    DivisionMinScore = division.LowerLimit,
                    DivisionId       = division.Id
                },
                Schedule = schedule
            };

            var directory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\\logos");
            var path      = Directory.GetFiles(directory).FirstOrDefault(x => x.Contains(rosterId.ToString()));

            if (File.Exists(path))
            {
                var byteData = await File.ReadAllBytesAsync(path);

                var base64 = Convert.ToBase64String(byteData);
                var type   = GetContentType(path);
                var imgSrc = string.Format($"data:{type};base64,{base64}");
                rosterView.FileSource = imgSrc;
            }
            rosterView.Cleanup();

            return(rosterView);
        }