def __init__(self):
     self.card_db = CardParser()
     self.black_deck = self.create_deck(card_type='Q')
     self.white_deck = self.create_deck(card_type='A')
     self.all_cards = {card.card_id: card for card in self.black_deck + self.white_deck}
     self.discarded_white_cards = []
     self.discarded_black_cards = []
     self.judged_cards = []
     self.current_black_card = None
class CardHandler():
    def __init__(self):
        self.card_db = CardParser()
        self.black_deck = self.create_deck(card_type='Q')
        self.white_deck = self.create_deck(card_type='A')
        self.all_cards = {card.card_id: card for card in self.black_deck + self.white_deck}
        self.discarded_white_cards = []
        self.discarded_black_cards = []
        self.judged_cards = []
        self.current_black_card = None

    def create_deck(self, card_type, expansions=None):
        """
        Initialises new white or black card deck for play
        :param card_type:  Indicates whether to return a white deck or black deck
        :return:
        """
        if not expansions:
            expansions = ["Base"]
        deck = []
        cards = self.card_db.return_cards()
        index = 0
        for card in cards:
            if card['expansion'] not in expansions:
                continue

            if card['cardType'] == card_type:
                card = Card(card_id=index,
                            card_type=card['cardType'],
                            text=card['text'],
                            num_answers=card['numAnswers'],
                            expansion=card['expansion'])
                deck.append(card)
                index += 1
        random.shuffle(deck)
        return deck

    def draw_hand(self, player):
        """
        For the player specified, draw back up to 10 cards.
        :param player:
        :return:
        """
        cards_to_draw = (10 - player.hand_size)
        if len(self.white_deck) < cards_to_draw:
            self.shuffle_discards_into_white_deck()
        for _ in range(cards_to_draw):
            player.hand.add(self.white_deck.pop())
        assert player.hand_size == 10
        return

    def draw_black_card(self):
        """
        For the card czar specified, draw 1 fresh black cards.
        :param player:
        :return:
        """
        cards_to_draw = 1
        if len(self.black_deck) < cards_to_draw:
            self.shuffle_discards_into_black_deck()
        return self.black_deck.pop()

    def discard(self, card=None):
        """
        Appends a card being removed from a players hand to the discard pile
        :type card: Card
        :return:
        """
        self.discarded_white_cards.append(card)
        return

    def shuffle_discards_into_white_deck(self):
        self.white_deck.append(self.discarded_white_cards)
        random.shuffle(self.white_deck)
        return

    def shuffle_discards_into_black_deck(self):
        self.black_deck.append(self.discarded_black_cards)
        random.shuffle(self.black_deck)
        return

    def get_card_by_id(self, card_id):
        return self.all_cards.get(card_id)