public void HandleRequestAsync(RequestModel requestModel, IOutputBoundary <ResponseModel> outputBoundary)
        {
            _ = requestModel?.PlayerId ?? throw new ArgumentNullException(nameof(requestModel.PlayerId));

            var avitar = AvitarRepository.ReadAsync(requestModel.PlayerId);

            var currentPlayer = new BlackJackPlayer(avitar, HandIdProvider, requestModel.HandCount);

            var keyAndGame = GameRepository.FindByStatusFirstOrDefault(GameStatus.Waiting, requestModel.MaxPlayers);

            string        gameIdentifier;
            BlackJackGame game;

            if (string.IsNullOrEmpty(keyAndGame.Key))
            {
                gameIdentifier = GameIdProviders.GenerateGameId();
                game           = new BlackJackGame(CardProvider, DealerProvider.Dealer, requestModel.MaxPlayers);
            }
            else
            {
                gameIdentifier = keyAndGame.Key;
                game           = keyAndGame.Value;
            }

            game.AddPlayer(currentPlayer);

            GameRepository.UpdateAsync(gameIdentifier, game);

            outputBoundary.HandleResponse(new ResponseModel()
            {
                GameIdentifier = gameIdentifier
            });
        }
        public BlackJackGame FindOpenGame(GameStatus status, int maxPlayers)
        {
            //TODO: This could use some work. aka not efficient
            var gameRecord = games
                             .Where(x => x.Value.Status == status && x.Value.Players.Count() <= maxPlayers)
                             .Select(x => x.Value)
                             .FirstOrDefault();

            if (gameRecord != null)
            {
                return(gameRecord);
            }
            var gameId = _gameIdProvider.GenerateGameId();
            var dealer = _dealerProvider.Dealer;

            var game = new BlackJackGame(gameId, _cardProvider, dealer, maxPlayers);

            games.Add(game.Id, game);

            return(game);
        }