import random
from pyscript import document

class RPSGame:
    def __init__(self, best_of = 3):
        self.user_score = 0
        self.ai_score = 0
        self.deck = self.build_deck()
        self.refresh_hand()
        self.rounds_to_win = (best_of // 2) + 1
        self.update_ui()

    def rock(self, lst, n):
        lst.extend(["Rock"] * n)
        return lst

    def paper(self, lst, n):
        lst.extend(["Paper"] * n)
        return lst

    def scissors(self, lst, n):
        lst.extend(["Scissors"] * n)
        return lst

    def generate_deck(self):
        cards = [self.rock, self.paper, self.scissors]
        deck = []

        random.shuffle(cards) # This is done, so the card types are not added in the same order everytime, is scissors is last everytime it could result in scissors always being low or high since the last card just are all sofar minus 52ยจ
        for i in range(2):
            n = random.randint(5, 20)
            deck = cards[i](deck, n)

        missing_cards = 52 - len(deck)
        deck = cards[2](deck, missing_cards)

        random.shuffle(deck)
        return deck

    def check_deck(self, lst):
        card_types = ["Rock", "Paper", "Scissors"]
        for card_type in card_types:
            if lst.count(card_type) >= 25:
                return False
        return True

    def build_deck(self):
        acceptable_deck = False
        while not acceptable_deck:
            deck = self.generate_deck()
            acceptable_deck = self.check_deck(deck)
        return deck

    def give_cards(self):
        return [self.deck.pop(0) for _ in range(3)], [self.deck.pop(0) for _ in range(3)]

    def battle(self, user_card, ai_card):
        if user_card == ai_card:
            return 0
        if (user_card == "Rock" and ai_card == "Scissors") or \
           (user_card == "Paper" and ai_card == "Rock") or \
           (user_card == "Scissors" and ai_card == "Paper"):
            return 1
        return -1

    def refresh_hand(self):
        self.user_hand, self.ai_hand = self.give_cards()
        print("New cards")
        print(f"AI cards: {self.ai_hand}")
        print(f"{len(self.deck)} Cards left.")

    def play_card(self, event):
        index = int(event.target.getAttribute("index"))
        if index >= len(self.user_hand):
            return

        user_card = self.user_hand.pop(index)
        ai_card = self.ai_hand.pop(random.randint(0, len(self.ai_hand) - 1))

        result = self.battle(user_card, ai_card)
        if result == 1:
            self.user_score += 1
            round_result = f"You win! {user_card} beats {ai_card}."
            self.refresh_hand()
        elif result == -1:
            self.ai_score += 1
            round_result = f"AI wins! {ai_card} beats {user_card}."
            self.refresh_hand()
        else:
            round_result = "It's a tie! Try again"

        if not self.user_hand or not self.ai_hand:
            self.refresh_hand()
        if self.user_score < self.rounds_to_win and self.ai_score < self.rounds_to_win:
            pass
        else:
            if self.user_score < self.ai_score:
                round_result = "You lost D: Better luck next time"
                self.update_ui(round_result)
                self.disable_buttons()
                return
            else:
                round_result = "You won great :D"
                self.update_ui(round_result)
                self.disable_buttons()
                return

        self.update_ui(round_result)

    def update_ui(self, result_text="Waiting for your move..."):
        print("Update UI")
        document.querySelector("#user-score").innerText = str(self.user_score)
        document.querySelector("#ai-score").innerText = str(self.ai_score)
        document.querySelector("#result").innerText = result_text
        document.querySelector("#reset-game").disabled = False
        for i in range(3):
            btn = document.querySelector(f"#card-{i}")
            if i < len(self.user_hand):
                card_name = self.user_hand[i].lower()  # Convert "Rock" -> "rock"
                btn.style.backgroundImage = f"url('images/{card_name}.png')"
                btn.disabled = False
            else:
                btn.style.backgroundImage = "url('images/card-back.png')"  # Unknown card
                btn.disabled = True

    def disable_buttons(self):
        print("disable button function")
        for i in range(3):
            btn = document.querySelector(f"#card-{i}")
            btn.style.backgroundImage = "url('images/card-back.png')"
            btn.disabled = True

    def reset_game(self, event=None):
        print("Game Reset")
        self.user_score = 0
        self.ai_score = 0
        self.deck = self.build_deck()
        self.refresh_hand()
        self.deck_overview()
        self.update_ui("Game reset! Pick a card to start.")

    def deck_overview(self):
        print(f"{self.deck.count('Rock')} Rock cards")
        print(f"{self.deck.count('Paper')} Paper cards")
        print(f"{self.deck.count('Scissors')} Scissors cards")

# Start the game
game = RPSGame(5)
game.deck_overview()