public async Task <ResponseGameViewModel> DealCards(int gameId)
        {
            var result = await GameResponse(gameId);

            var deckFromCache    = _deckProvider.Get();
            var handCardsToCache = new List <HandCards>();
            var cardToUser       = new List <Card>();
            var move             = new Move();
            var moves            = new List <Move>();
            var game             = await _gameRepository.Get(gameId);

            var userGames = await _userGamesRepository.Get(game);

            var users = await _userRepository.Get(userGames);

            var dealer = users.FirstOrDefault(x => x.UserRole == UserRole.Dealer);
            var rounds = await _roundRepository.Get(game);

            var userRounds = await _userRoundRepository.Get(users);

            for (int i = 0; i < users.Count(); i++)
            {
                if (users.ElementAt(i).UserRole != UserRole.Dealer && users.ElementAt(i).UserRole != UserRole.None)
                {
                    cardToUser = deckFromCache.Cards.Skip(deckFromCache.Cards.Count - 2).ToList();
                    handCardsToCache.Add(new HandCards {
                        Cards = cardToUser, User = users.ElementAt(i)
                    });
                    result.Users.FirstOrDefault(x => x.Nickname == users.ElementAt(i).Nickname).Cards = _mapper.Map <List <ResponseCardViewModel> >(cardToUser);
                    deckFromCache.Cards.RemoveRange(deckFromCache.Cards.Count - 2, 2);
                    move = new Move {
                        RoundId = rounds.Last().Id, UserId = users.ElementAt(i).Id, CardId = cardToUser[0].Id
                    };
                    moves.Add(move);
                    move = new Move {
                        RoundId = rounds.Last().Id, UserId = users.ElementAt(i).Id, CardId = cardToUser[1].Id
                    };                                                                                                         //fix this shit
                    moves.Add(move);
                }
                if (await IsBlackJack(moves) && users.ElementAt(i).UserRole != UserRole.Dealer)
                {
                    userRounds.FirstOrDefault(x => x.UserId == users.ElementAt(i).Id).IsWin = true;
                }
            }

            await _moveRepository.CreateRange(moves);

            moves.RemoveRange(0, moves.Count);
            cardToUser = deckFromCache.Cards.Skip(deckFromCache.Cards.Count - 2).ToList();
            handCardsToCache.Add(new HandCards {
                Cards = cardToUser, User = dealer
            });
            result.Users.FirstOrDefault(x => x.UserRole == UserRole.Dealer).Cards = _mapper.Map <List <ResponseCardViewModel> >(cardToUser);
            deckFromCache.Cards.RemoveRange(deckFromCache.Cards.Count - 2, 2);
            move = new Move {
                RoundId = rounds.Last().Id, UserId = users.FirstOrDefault(x => x.UserRole == UserRole.Dealer).Id, CardId = cardToUser[0].Id
            };
            await _moveRepository.Create(move);

            _deckProvider.Update(new Deck {
                Cards = deckFromCache.Cards, DiscardPile = new List <Card>()
            });
            _handCardsProvider.AddRange(handCardsToCache);

            if (await IsBlackJack(moves))
            {
                result.Rounds.Last().IsOver = true;
                await SetLoserMoves(userRounds);
            }

            return(result);
        }
        public async Task SeedsAsync(int initialIndex)
        {
            var typeLists = _typeRepository.GetAll();
            int moveIndex = initialIndex;

            try {
                using (var client = new HttpClient())
                {
                    client.BaseAddress = new Uri(_apiUrl);
                    for (int i = initialIndex; i <= 728; i++)
                    {
                        moveIndex = i;
                        HttpResponseMessage results;
                        bool responseSuccess = false;
                        int  errorCount      = 0;
                        do
                        {
                            var responseTask = client.GetAsync(string.Concat("move/", i));
                            responseTask.Wait();
                            results         = responseTask.Result;
                            responseSuccess = results.IsSuccessStatusCode;
                            if (!responseSuccess)
                            {
                                errorCount++;
                            }
                            if (errorCount == 3)
                            {
                                throw new PokeApiException();
                            }
                        } while (responseSuccess == false);

                        string apiResponse = await results.Content.ReadAsStringAsync();

                        var json               = JObject.Parse(apiResponse);
                        var name               = json["names"][2]["name"].ToString();
                        var basePowerString    = json["power"].ToString();
                        var moveTypeString     = json["type"]["name"].ToString();
                        var moveCategoryString = json["damage_class"]["name"].ToString();

                        var basePower    = basePowerString.ToDecimal();
                        var moveType     = typeLists.FirstOrDefault(x => x.Name.ToLower() == moveTypeString);
                        var moveCategory = (MoveCategoryEnum)typeof(MoveCategoryEnum).GetEnumByDescription(moveCategoryString);

                        if (moveCategory == MoveCategoryEnum.Status)
                        {
                            continue;
                        }

                        var move = new Moves()
                        {
                            Name          = name,
                            Base_Power    = basePower,
                            Move_Category = moveCategory,
                            Id_Type       = moveType.Id
                        };

                        _moveRepository.Create(move);
                    }
                }
            }
            catch (Exception ex) {
                using (var logger = LoggerDomain.GetLog(_connectionString))
                {
                    logger.Error(string.Format("Error at pokemonSpecies {0} - Exception Message: ", moveIndex, ex.Message));
                    throw ex;
                }
            }
        }