import random

def take_card(hand):
    hand.append(deck.pop(random.randrange(len(deck))))

def reset():
    global deck
    global player_hand
    global dealer_hand
    global round_over

    deck = []
    for suit in ('club', 'diamond', 'heart', 'spade'):
        for rank in range(1, 14):
            deck.append({'suit': suit, 'rank': rank})

    player_hand = []
    take_card(player_hand)
    take_card(player_hand)

    dealer_hand = []
    take_card(dealer_hand)
    take_card(dealer_hand)

    round_over = False

reset()

def get_total(hand):
    total = 0
    has_ace = False

    for card in hand:
        if card['rank'] > 10:
            total += 10
        else:
            total += card['rank']

        if card['rank'] == 1:
            has_ace = True

    if has_ace and total <= 11:
        total += 10

    return total

def on_key_down(key):
    global round_over

    if not round_over:
        if key == keys.H:
            take_card(player_hand)
            if get_total(player_hand) >= 21:
                round_over = True
        elif key == keys.S:
            round_over = True

        if round_over:
            while get_total(dealer_hand) < 17:
                take_card(dealer_hand)
    else:
        reset()

def draw():
    screen.fill((255, 255, 255))

    output = []

    output.append('Player hand:')
    for card in player_hand:
        output.append('suit: ' + card['suit'] + ', rank: ' + str(card['rank']))
    output.append('Total: ' + str(get_total(player_hand)))

    output.append('')

    output.append('Dealer hand:')
    for card_index, card in enumerate(dealer_hand):
        if not round_over and card_index == 0:
            output.append('(Card hidden)')
        else:
            output.append('suit: ' + card['suit'] + ', rank: ' + str(card['rank']))

    if round_over:
        output.append('Total: ' + str(get_total(dealer_hand)))
    else:
        output.append('Total: ?')

    if round_over:
        output.append('')

        def has_hand_won(this_hand, other_hand):
            return (
                get_total(this_hand) <= 21
                and (
                    get_total(other_hand) > 21
                    or get_total(this_hand) > get_total(other_hand)
                )
            )

        if has_hand_won(player_hand, dealer_hand):
            output.append('Player wins')
        elif has_hand_won(dealer_hand, player_hand):
            output.append('Dealer wins')
        else:
            output.append('Draw')

    card_spacing = 60
    margin_x = 10

    for card_index, card in enumerate(dealer_hand):
        image = card['suit'] + '_' + str(card['rank'])
        if not round_over and card_index == 0:
            image = 'card_face_down'
        screen.blit(image, (card_index * card_spacing + margin_x, 30))

    for card_index, card in enumerate(player_hand):
        screen.blit(card['suit'] + '_' + str(card['rank']),
            (card_index * card_spacing + margin_x, 140))

    if round_over:
        screen.draw.text('Total: ' + str(get_total(dealer_hand)),
            (margin_x, 10), color=(0, 0, 0))
    else:
        screen.draw.text('Total: ?', (margin_x, 10), color=(0, 0, 0))

    screen.draw.text('Total: ' + str(get_total(player_hand)),
        (margin_x, 120), color=(0, 0, 0))