import tkinter as tk
from tkinter import messagebox
from app.panel_derecho.chat import Chat
import threading
import time
import pygame  # Para reproducir música

class PanelDerecho:
    def __init__(self, frame):
        self.usuario_email = None
        self.usuario_password = None
        # Inicializar el cliente de chat
        self.chat_client = Chat()
        try:
            self.chat_client.conectar_al_servidor()
        except Exception as e:
            messagebox.showerror("Error", f"No se pudo conectar al servidor de chat: {e}")

        # Inicializar el reproductor de música
        pygame.mixer.init()

        # Asociar el frame del panel derecho
        self.frame = frame
        self.frame.configure(bg="lightblue", width=200)
        self.frame.grid_propagate(False)
        self.frame.columnconfigure(0, weight=1)
        
        # Botón de iniciar sesión (y cerrar sesión)
        frame_login = tk.Frame(frame, bg="lightblue")
        frame_login.grid(row=0, column=0, pady=5, sticky="ew")

        self.btn_login = tk.Button(
            frame_login, text="🔑 Iniciar Sesión",
            font=("Helvetica", 11, "bold"), bg="orange", fg="white",
            command=self.mostrar_login
        )
        self.btn_login.pack(padx=5)

        self.btn_logout = tk.Button(
            frame_login, text="🚪 Cerrar Sesión",
            font=("Helvetica", 11, "bold"), bg="red", fg="white",
            command=self.cerrar_sesion
        )
        self.btn_logout.pack(padx=5)
        self.btn_logout.pack_forget()  # Ocultar hasta iniciar sesión

        # Área de entrada de mensaje
        mensaje_label = tk.Label(self.frame, text="CHAT", font=("Helvetica", 10), bg="lightblue")
        mensaje_label.grid(row=1, column=0, sticky="w", padx=5)
        self.entrada_mensaje = tk.Text(self.frame, height=5, bg="lightyellow", wrap="word")
        self.entrada_mensaje.grid(row=2, column=0, sticky="ew", padx=5, pady=5)

        # Botón de enviar
        boton_enviar = tk.Button(self.frame, text="Enviar", bg="lightgreen", command=self.enviar_mensaje)
        boton_enviar.grid(row=3, column=0, pady=5, padx=5, sticky="ew")

        # Listado de mensajes
        mensajes_frame = tk.Frame(self.frame, bg="white", bd=2, relief="sunken")
        mensajes_frame.grid(row=4, column=0, sticky="nsew", padx=5, pady=5)
        mensajes_frame.columnconfigure(0, weight=1)
        self.mensajes_frame = mensajes_frame

        # Reproductor de música
        musica_frame = tk.Frame(self.frame, bg="lightgray", height=50)
        musica_frame.grid(row=5, column=0, sticky="ew", padx=5, pady=5)
        tk.Label(musica_frame, text="Reproductor música", bg="lightgray", font=("Helvetica", 10)).pack()

        # Botones de control de música
        boton_play = tk.Button(musica_frame, text="Play", bg="green", fg="white", command=self.reproducir_musica_thread)
        boton_play.pack(side="left", padx=5)

        boton_pause = tk.Button(musica_frame, text="Pause", bg="orange", fg="white", command=self.pausar_musica_thread)
        boton_pause.pack(side="left", padx=5)

        boton_restart = tk.Button(musica_frame, text="Restart", bg="blue", fg="white", command=self.reiniciar_musica_thread)
        boton_restart.pack(side="left", padx=5)

        self.frame.rowconfigure(4, weight=1)

        # Iniciar actualización de mensajes
        self.iniciar_actualizacion_mensajes()
    
    def mostrar_login(self):
        login_window = tk.Toplevel()
        login_window.title("Iniciar Sesión")
        login_window.geometry("300x200")
        
        tk.Label(login_window, text="Correo Electrónico:", font=("Helvetica", 11)).pack(pady=5)
        entry_email = tk.Entry(login_window, width=30)
        entry_email.pack(pady=5)

        tk.Label(login_window, text="Contraseña:", font=("Helvetica", 11)).pack(pady=5)
        entry_password = tk.Entry(login_window, width=30, show="*")
        entry_password.pack(pady=5)

        def validar_login():
            email = entry_email.get()
            password = entry_password.get()

            if not email or not password:
                messagebox.showerror("Error", "⚠️ Debes ingresar ambos campos.")
                return

            self.set_credentials(email, password)
            messagebox.showinfo("Éxito", "✅ Inicio de sesión exitoso.")
            self.btn_login.pack_forget()
            self.btn_logout.pack()
            login_window.destroy()

        tk.Button(
            login_window, text="🔑 Iniciar Sesión",
            font=("Helvetica", 11, "bold"),
            bg="orange", fg="white",
            command=validar_login
        ).pack(pady=10)

    def cerrar_sesion(self):
        """Cierra sesión y elimina las credenciales almacenadas."""
        self.clear_credentials()
        messagebox.showinfo("Sesión Cerrada", "🚪 Has cerrado sesión correctamente.")
        self.btn_logout.pack_forget()
        self.btn_login.pack()

    def set_credentials(self, email, password):
        """Establece las credenciales de inicio de sesión."""
        self.usuario_email = email
        self.usuario_password = password

    def clear_credentials(self):
        """Limpia las credenciales de inicio de sesión."""
        self.usuario_email = None
        self.usuario_password = None
    
    def get_credentials(self):
        """Devuelve las credenciales de usuario (email, password)."""
        return self.usuario_email, self.usuario_password


    def enviar_mensaje(self):
        """Enviar un mensaje al servidor."""
        texto = self.entrada_mensaje.get("1.0", tk.END).strip()
        if texto:
            try:
                self.chat_client.enviar_mensaje(texto)
                self.entrada_mensaje.delete("1.0", tk.END)
            except Exception as e:
                messagebox.showerror("Error", f"No se pudo enviar el mensaje: {e}")
        else:
            messagebox.showwarning("Aviso", "El mensaje está vacío.")

    def actualizar_lista_mensajes(self):
        """Muestra los mensajes en la interfaz."""
        for widget in self.mensajes_frame.winfo_children():
            widget.destroy()

        for mensaje in self.chat_client.mensajes_recibidos:
            mensaje_label = tk.Label(self.mensajes_frame, text=mensaje, anchor="w", justify="left", bg="white", wraplength=180)
            mensaje_label.pack(fill="x", padx=5, pady=2)

    def iniciar_actualizacion_mensajes(self):
        """Inicia un ciclo para actualizar los mensajes en la interfaz."""
        def ciclo():
            while True:
                self.actualizar_lista_mensajes()
                self.frame.update_idletasks()
                time.sleep(0.5)

        threading.Thread(target=ciclo, daemon=True).start()


    # Métodos para control de música
    def reproducir_musica_thread(self):
        """Inicia un hilo para reproducir música."""
        threading.Thread(target=self.reproducir_musica, daemon=True).start()

    def reproducir_musica(self):
        """Reproduce una canción."""
        try:
            pygame.mixer.music.load("cancion.mp3") 
            pygame.mixer.music.play()
            messagebox.showinfo("Reproducción", "Reproduciendo canción.")
        except pygame.error as e:
            messagebox.showerror("Error", f"No se pudo reproducir la canción: {e}")

    def pausar_musica_thread(self):
        """Inicia un hilo para pausar la música."""
        threading.Thread(target=self.pausar_musica, daemon=True).start()

    def pausar_musica(self):
        """Pausa la música."""
        pygame.mixer.music.pause()
        messagebox.showinfo("Reproducción", "Música en pausa.")

    def reiniciar_musica_thread(self):
        """Inicia un hilo para reiniciar la música."""
        threading.Thread(target=self.reiniciar_musica, daemon=True).start()

    def reiniciar_musica(self):
        """Reinicia la música desde el principio."""
        pygame.mixer.music.stop()
        pygame.mixer.music.play()
        messagebox.showinfo("Reproducción", "Reproduciendo desde el principio.")