UserRank IUserDataProcessingService.ProcessUserRankFromLadder(string jsonResponse, Ladders ladder, AoeNetAPIStringResources apiStringResources)
        {
            var ratingResponse = JsonConvert.DeserializeObject <UserLadderDataResponse>(jsonResponse);

            //response to UserRank model
            var userRank = new UserRank
            {
                //we always want to use .First() becouse api don't allow for multiple requests between multiple leadboards
                Elo    = ratingResponse.Leaderboard.First().Rating,
                Ladder = ratingResponse.Leaderboard.First().Rank
            };

            var userRankData = new UserData();

            userRankData.UserRatings.Add(ladder, userRank);

            return(userRank);
        }
        UserLadderData IUserDataProcessingService.ProcessUserDataFromLadder(string jsonResponse, AoeNetAPIStringResources apiStringResources)
        {
            var leadbord   = JsonConvert.DeserializeObject <UserLadderDataResponse>(jsonResponse);//.Leaderboard.First();
            var ladderData = leadbord.Leaderboard.First();

            return(new UserLadderData()
            {
                Country = ladderData.Country,
                PreviousRating = ladderData.PreviousRating,
                HighestRating = ladderData.HighestRating,
                Streak = ladderData.Streak,
                LowestStreak = ladderData.LowestStreak,
                HighestStreak = ladderData.HighestStreak,
                Games = ladderData.Games,
                Wins = ladderData.Wins,
                Losses = ladderData.Losses,
                Drops = ladderData.Drops
            });
        }
        Match IUserDataProcessingService.ProcessMatch(string jsonResponse, AoeNetAPIStringResources apiStringResources)
        {
            var matchResponse = JsonConvert.DeserializeObject <MatchResponse>(
                jsonResponse
                );

            var match = new Match
            {
                //todo: handle opened as separate state independent then start
                Opened = matchResponse.last_match.started,

                Finished = matchResponse.last_match.finished,
                MatchId  = matchResponse.last_match.match_id,

                Users     = new List <UserMatchData>(),
                MatchType = (MatchType)matchResponse.last_match.leaderboard_id
            };

            //create user match data models from response model
            foreach (var player in matchResponse.last_match.players)
            {
                //assign basic data
                UserMatchData userMatchData = new UserMatchData
                {
                    Name = player.name,


                    Team  = player.team,
                    Color = ((UserColors)player.color).ToString()
                };

                //for compatibility with: MatchMinimalResponse set, cause API is returning null civs sometimes
                string civilization = "";

                try
                {
                    civilization = apiStringResources.Civ //find matching civilization from API resources
                                   .First(id => id.Id == player.civ)
                                   .String;
                }
                catch (Exception e)
                {
                    if (
                        e is StackOverflowException ||
                        e is ThreadAbortException ||
                        e is AccessViolationException
                        )
                    {
                        throw e;
                    }

                    civilization = "Unknown uivilization";
                }
                finally
                {
                    userMatchData.Civilization = civilization;
                }

                //assign game profile id
                var userGameProfileId = new UserGameProfileId
                {
                    ProfileId = player.profile_id.ToString()
                };
                userMatchData.UserGameProfileId = userGameProfileId;
                userMatchData.UserRankData      = new UserData();
                userMatchData.MatchType         = (MatchType)matchResponse.last_match.leaderboard_id;

                //assign ratings if aviable
                if (player.rating != null)
                {
                    var ratingType = (Ladders)matchResponse.last_match.leaderboard_id;

                    var userRank = new UserRank
                    {
                        Elo    = player.rating.Value,
                        Ladder = null //we have to send separate request to check ladder
                    };

                    userMatchData.UserRankData.UserRatings.Add(ratingType, userRank);
                }

                match.Users.Add(userMatchData);
            }

            return(match);
        }