import tkinter as tk
from tkinter import messagebox
import threading
import random
import time


class GamblingGameWithThreads:
    def __init__(self, root):
        self.root = root
        self.root.title("Juego de Azar - Ruleta con Hilos")
        self.root.geometry("400x400")

        # Variables del juego
        self.balance = 100
        self.roulette_number = None
        self.roulette_running = False
        self.roulette_thread = None

        # Etiqueta de saldo
        self.balance_label = tk.Label(self.root, text=f"Saldo: $ {self.balance}", font=("Arial", 14))
        self.balance_label.pack(pady=10)

        # Entrada para la apuesta
        tk.Label(self.root, text="Tu Apuesta ($):", font=("Arial", 12)).pack()
        self.bet_entry = tk.Entry(self.root, width=10, font=("Arial", 12))
        self.bet_entry.pack(pady=5)

        # Entrada para elegir número
        tk.Label(self.root, text="Elige un número (1-10):", font=("Arial", 12)).pack()
        self.number_entry = tk.Entry(self.root, width=10, font=("Arial", 12))
        self.number_entry.pack(pady=5)

        # Botones de control
        self.start_button = tk.Button(self.root, text="Iniciar Ruleta", font=("Arial", 12), command=self.start_roulette)
        self.start_button.pack(pady=10)

        self.stop_button = tk.Button(self.root, text="Detener Ruleta", font=("Arial", 12), state="disabled", command=self.stop_roulette)
        self.stop_button.pack(pady=5)

        # Resultado del juego
        self.result_label = tk.Label(self.root, text="", font=("Arial", 12), fg="blue")
        self.result_label.pack(pady=10)

        # Número de la ruleta en tiempo real
        self.roulette_label = tk.Label(self.root, text="Ruleta: ---", font=("Arial", 16), fg="red")
        self.roulette_label.pack(pady=10)

    def start_roulette(self):
        """Inicia el giro de la ruleta en un hilo."""
        if self.roulette_running:
            messagebox.showwarning("Advertencia", "La ruleta ya está girando.")
            return

        try:
            bet = int(self.bet_entry.get())
            chosen_number = int(self.number_entry.get())
        except ValueError:
            messagebox.showerror("Error", "Por favor, ingresa valores numéricos válidos.")
            return

        if bet <= 0 or chosen_number < 1 or chosen_number > 10:
            messagebox.showwarning("Advertencia", "La apuesta debe ser mayor a $0 y elige un número entre 1 y 10.")
            return

        if bet > self.balance:
            messagebox.showwarning("Advertencia", "No tienes suficiente saldo para esta apuesta.")
            return

        self.bet = bet
        self.chosen_number = chosen_number
        self.roulette_running = True
        self.start_button.config(state="disabled")
        self.stop_button.config(state="normal")

        # Crear y arrancar el hilo de la ruleta
        self.roulette_thread = threading.Thread(target=self.spin_roulette)
        self.roulette_thread.start()

    def spin_roulette(self):
        """Simula el giro continuo de la ruleta."""
        while self.roulette_running:
            self.roulette_number = random.randint(1, 10)
            self.roulette_label.config(text=f"Ruleta: {self.roulette_number}")
            time.sleep(0.1)

    def stop_roulette(self):
        """Detiene la ruleta y evalúa el resultado del juego."""
        if not self.roulette_running:
            return

        self.roulette_running = False
        self.start_button.config(state="normal")
        self.stop_button.config(state="disabled")

        # Evaluar resultado
        if self.chosen_number == self.roulette_number:
            winnings = self.bet * 2
            self.balance += winnings
            self.result_label.config(
                text=f"¡Ganaste! El número fue {self.roulette_number}. Ganaste $ {winnings}.",
                fg="green",
            )
        else:
            self.balance -= self.bet
            self.result_label.config(
                text=f"Perdiste. El número fue {self.roulette_number}. Perdiste $ {self.bet}.",
                fg="red",
            )

        # Actualizar saldo
        self.balance_label.config(text=f"Saldo: $ {self.balance}")

        # Revisar si el jugador se quedó sin saldo
        if self.balance <= 0:
            messagebox.showinfo("Juego Terminado", "¡Te quedaste sin saldo! Gracias por jugar.")
            


if __name__ == "__main__":
    root = tk.Tk()
    app = GamblingGameWithThreads(root)
    root.mainloop()
