import random


def create_deck():
    """Erzeugt ein gemischtes Kartendeck."""
    suits = ["♠", "♥", "♦", "♣"]
    ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]

    deck = [(rank, suit) for suit in suits for rank in ranks]
    random.shuffle(deck)
    return deck


def hand_value(hand):
    """Berechnet den Wert einer Blackjack-Hand."""
    value = 0
    aces = 0

    for rank, _ in hand:
        if rank in ["J", "Q", "K"]:
            value += 10
        elif rank == "A":
            value += 11
            aces += 1
        else:
            value += int(rank)

    # Asse bei Bedarf von 11 auf 1 reduzieren
    while value > 21 and aces > 0:
        value -= 10
        aces -= 1

    return value


def show_hand(name, hand, hide_first=False):
    """Gibt eine Hand als Text aus."""
    if hide_first:
        cards = ["[verdeckt]"] + [
            f"{rank}{suit}" for rank, suit in hand[1:]
        ]
        print(f"{name}: {' '.join(cards)}")
    else:
        cards = [f"{rank}{suit}" for rank, suit in hand]
        print(f"{name}: {' '.join(cards)}  Wert: {hand_value(hand)}")


def play_blackjack():
    deck = create_deck()

    player = [deck.pop(), deck.pop()]
    dealer = [deck.pop(), deck.pop()]

    print("\n=== Blackjack ===")
    print("Befehle: h = Hit, s = Stand\n")

    # Spielerzug
    while True:
        show_hand("Dealer", dealer, hide_first=True)
        show_hand("Spieler", player)

        player_value = hand_value(player)

        if player_value == 21:
            print("\nBlackjack!")
            break

        if player_value > 21:
            print("\nÜber 21 – du hast verloren.")
            return

        choice = input("\nHit oder Stand? [h/s]: ").strip().lower()

        if choice in ["h", "hit"]:
            player.append(deck.pop())
            print("\nDu ziehst eine Karte.\n")
        elif choice in ["s", "stand"]:
            break
        else:
            print("Bitte h für Hit oder s für Stand eingeben.")

    # Dealerzug
    print("\n--- Dealer ist am Zug ---")
    show_hand("Dealer", dealer)

    while hand_value(dealer) < 17:
        dealer.append(deck.pop())
        print("Dealer zieht eine Karte.")
        show_hand("Dealer", dealer)

    dealer_value = hand_value(dealer)
    player_value = hand_value(player)

    # Ergebnis
    print("\n--- Ergebnis ---")
    show_hand("Spieler", player)
    show_hand("Dealer", dealer)

    if dealer_value > 21:
        print("Dealer ist über 21 – du gewinnst!")
    elif player_value > dealer_value:
        print("Du gewinnst!")
    elif player_value < dealer_value:
        print("Dealer gewinnt.")
    else:
        print("Unentschieden.")


def main():
    while True:
        play_blackjack()

        again = input("\nNoch einmal spielen? [j/n]: ").strip().lower()
        if again not in ["j", "ja", "y", "yes"]:
            print("Spiel beendet.")
            break


if __name__ == "__main__":
    main()