@Override
    public Card drawCard(int playerId) throws ActionNotAllowedException {
        if (gameStatus.isBeginningCardDrawn() && playerOnTheMove(playerId)) {
            throw new ActionNotAllowedException(EXCEPTION_DRAW_MORE_THAN_ONE_CARD);
        }

        if (playerIsNotOnTheMove(playerId)) {
            throw new ActionNotAllowedException(EXCEPTION_DRAW_CARD_NOT_ON_THE_MOVE);
        }

        Card cardDrawn = gameStatus.getCardDeck().remove(0);
        gameStatus.getPlayerCardMap().get(String.valueOf(playerId)).add(cardDrawn);

        if (!gameStatus.isBeginningCardDrawn()) {
            gameStatus.setBeginningCardDrawn(true);
        }

        if (gameStatus.getCardDeck().isEmpty()) {
            Collections.shuffle(gameStatus.getDiscardedCards());
            gameStatus.getCardDeck().addAll(gameStatus.getDiscardedCards());
            gameStatus.getDiscardedCards().clear();
        }

        return cardDrawn;
    }