import random

suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')
ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')
values = {'Two': 2, 'Three': 3, 'Four': 4, 'Five': 5, 'Six': 6, 'Seven': 7, 'Eight': 8, 'Nine': 9, 'Ten': 10,
          'Jack': 10,
          'Queen': 10, 'King': 10, 'Ace': 11}

playing = True


class Card:

    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        return self.rank + ' of ' + self.suit


class Deck:

    def __init__(self):
        self.deck = []  # start with an empty list
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit, rank))  # build Card objects and add them to the list

    def __str__(self):
        deck_comp = ''  # start with an empty string
        for card in self.deck:
            deck_comp += '\n ' + card.__str__()  # add each Card object's print string
        return 'The deck has:' + deck_comp

    def shuffle(self):
        random.shuffle(self.deck)

    def deal(self):
        single_card = self.deck.pop()
        # print(single_card)
        return single_card
class Hand:

    def __init__(self):
        self.cards = []  # start with an empty list as we did in the Deck class
        self.value = 0  # start with zero value
        self.aces = 0  # add an attribute to keep track of aces

    def add_card(self, card):
        self.cards.append(card)
        self.value += values[card.rank]
        if card.rank == 'Ace':
            self.aces += 1  # add to self.aces

    def adjust_for_ace(self):
        while self.value > 21 and self.aces:
            self.value -= 10
class Chips:
    def __init__(self):
        self.total = 100
        self.bet = 10
    def win_bet(self):
        self.total += 2 * self.bet
    def lose_bet(self):
        self.total -= self.bet
def take_bet(chips):
    while True:
        try:
            chips.bet = int(input("place a bet"))
        except:
            print("Wrong bet")
        else:
            if chips.bet > chips.total:
                print("Insufficient funds")
                continue
            else:
                print("bet placed successfully")
                break
def hit(deck,hand):
    x = deck.deal()
    hand.add_card(x)
    print("the hit card is {}".format(deck.deal()))
    hand.adjust_for_ace()
def hit_or_stand(deck, hand):
    global playing
    while True:
        x = input("do you want to hit of stand, presse H or S").upper()
        if x == "H":
            hit(deck,hand)
            print("player hit")
        elif x== "S":
            print('player stand, Dealer"s tern')
            playing = False
            break
            return False
        else:
            print("Wrong input, try again")
def show_some(player,dealer):
    print("\n Dealer's card:")
    print("hidden card")
    print(dealer.cards[1])
    print("\n Player's card:")  # * is printing everything in the list
    print(*player.cards)
def show_all(player,dealer):
    print("\n Player's card:")  # * is printing everything in the list
    print(*dealer.cards)
    print("Dealer's value", + dealer.value)
    print("\n Player's card:")  # * is printing everything in the list
    print("player's value")
    print(*player.cards)


def player_busts(player, dealer, chips):
    print("Player busts!")
    chips.lose_bet()


def player_wins(player, dealer, chips):
    print("Player wins!")
    chips.win_bet()


def dealer_busts(player, dealer, chips):
    print("Dealer busts!")
    chips.win_bet()


def dealer_wins(player, dealer, chips):
    print("Dealer wins!")
    chips.lose_bet()


def push(player, dealer):
    print("Dealer and Player tie! It's a push.")
def replay():
    TF = input("do you want to play again Y or N").upper()
    while not (TF == "Y" or TF == "N"):
        TF = input("Not sure what you mean, Y or N").upper()
    if TF == "Y":
        return True
    if TF == "N":
        return False

# total_bet = int(input("what is your total bet? recommending 100"))
while True:
    print("welcome to black jack")
    # Creat a shuffel the deck, deal two cards to each player
    deck = Deck()
    deck.shuffle()
    player_hand = Hand()
    player_hand.add_card(deck.deal())
    player_hand.add_card(deck.deal())

    dealer_hand = Hand()
    dealer_hand.add_card(deck.deal())
    dealer_hand.add_card(deck.deal())
    #set up player's chip
    # bet = int(input("what is your bet for this game? recommending 10"))
    player_chip = Chips()
    # promote the Player for bet
    take_bet(player_chip)
    #show some cards:
    show_some(player_hand,dealer_hand)
    while playing == True:
        # promote hit or stand for player
        hit_or_stand(deck,player_hand)
        #show cards
        show_some(player_hand,dealer_hand)
        # player 21 test
        if player_hand.value >  21:
            player_busts(player_hand,dealer_hand,player_chip)
            break
        # If Player hasn't busted, play Dealer's hand until Dealer reaches 17
    if player_hand.value <= 21:
        while dealer_hand.value <player_hand.value:
            hit(deck, dealer_hand)
            # Show all cards
        show_all(player_hand,dealer_hand)
            # Run different winning scenarios
        if dealer_hand.value > player_hand.value:
            dealer_wins(player_hand,dealer_hand,player_chip)
        elif dealer_hand.value > 21:
            dealer_busts(player_hand,dealer_hand,player_chip)
        elif dealer_hand.value < player_hand.value:
            player_wins(player_hand,dealer_hand,player_chip)
        else:
            push(player_hand, dealer_hand)
        # Inform Player of their chips total
    print("\n Player's total chips are at {}".format(player_chip.total))
        # Ask to play again

    new_game = input("Would you like to play another hand? Enter 'y' or 'n' ")

    if new_game[0].lower()=='y':
        playing=True
        continue
    else:
        playing = False
        print("Thanks for playing!")
        break