import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class PokerGame {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        // Symbole und Ränge definieren
        String[] suits = {"^", "+", "<>", "<3"};  // Pik, Kreuz, Karo, Herz
        String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};

        // Deck erstellen und mischen
        ArrayList<String> deck = createDeck(suits, ranks);
        Collections.shuffle(deck);

        // Spieler und Dealer erstellen
        Player player = new Player("Alice");
        Dealer dealer = new Dealer("Dealer");

        // Handkarten verteilen
        dealCards(deck, player, dealer);

        // Spieler-Hand anzeigen
        System.out.println("Deine Hand:");
        printHandSimple(player.hand);
        System.out.println();

        // Dealer-Hand zu Beginn verdeckt anzeigen
        dealer.showHiddenHand();

        // Hier könnten Spieleraktionen kommen (z.B. Karten tauschen)

        System.out.println("Welche Karten moechtest du tauschen?");
        System.out.println("Gib Zahlen ein (z.B. 1 3 5) oder 0 fuer keine:");

        printHandWithNumbers(player.hand);

        String input = sc.nextLine();
        if (!input.equals("0")) {
            String[] choices = input.split(" ");
            replaceSelectedCards(player.hand, deck, choices);
        }

        // Neue Hand anzeigen
        System.out.println("\nDeine neue Hand:");
        printHandSimple(player.hand);

        // Dealer zeigt Hand
        System.out.println("Dealer zeigt seine Hand:");
        printHandSimple(dealer.hand);

        sc.close();
    }

    // Deck erstellen
    public static ArrayList<String> createDeck(String[] suits, String[] ranks) {
        ArrayList<String> deck = new ArrayList<>();
        for (String suit : suits) {
            for (String rank : ranks) {
                deck.add(rank + " " + suit);
            }
        }
        return deck;
    }

    // Karten an Spieler und Dealer verteilen
    public static void dealCards(ArrayList<String> deck, Player player, Dealer dealer) {
        int cardIndex = 0;

        // Dealer zieht Karten (der Spieler sieht sie nicht)
        for (int i = 0; i < 5; i++) {
            dealer.addCard(deck.get(cardIndex++));
        }

        // Spieler zieht Karten
        for (int i = 0; i < 5; i++) {
            player.addCard(deck.get(cardIndex++));
        }
    }

    // Karten mit Nummern anzeigen
    public static void printHandWithNumbers(ArrayList<String> hand) {
        for (int i = 0; i < hand.size(); i++) {
            System.out.println((i + 1) + ": " + hand.get(i));
        }
    }

    // Nur ausgewählte Karten tauschen
    public static void replaceSelectedCards(ArrayList<String> hand, ArrayList<String> deck, String[] choices) {
        for (String c : choices) {
            int index = Integer.parseInt(c) - 1;
            if (index >= 0 && index < hand.size()) {
                hand.set(index, deck.remove(0));
            }
        }
    }

    // Schöne Darstellung der Hand
    public static void printHandSimple(ArrayList<String> hand) {
        for (String card : hand) {
            String[] parts = card.split(" ");
            String rank = parts[0];
            String suit = parts[1];

            if (suit.length() == 1) {
                suit = suit + " ";
            }

            String leftRank;
            String rightRank;

            if (rank.equals("10")) {
                leftRank = "10";
                rightRank = "10";
            } else {
                leftRank = rank + " ";
                rightRank = " " + rank;
            }

            System.out.println("+-----+");
            System.out.println("|" + leftRank + "   |");
            System.out.println("|  " + suit + " |");
            System.out.println("|   " + rightRank + "|");
            System.out.println("+-----+\n");
        }
    }
}

// Spieler-Klasse
class Player {
    String name;
    ArrayList<String> hand;

    public Player(String name) {
        this.name = name;
        this.hand = new ArrayList<>();
    }

    public void addCard(String card) {
        hand.add(card);
    }
}

// Dealer-Klasse
class Dealer {
    String name;
    ArrayList<String> hand;

    public Dealer(String name) {
        this.name = name;
        this.hand = new ArrayList<>();
    }

    public void addCard(String card) {
        hand.add(card);
    }

    // Dealer-Hand zu Beginn verdeckt anzeigen
    public void showHiddenHand() {
        System.out.println(name + "'s Hand:");
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("[? ?]");
        }
        System.out.println();
    }
}