import tkinter as tk
from tkinter import scrolledtext
import socket
import threading

class ChatWidget:
    def __init__(self, parent):
        """Widget de chat con conexión a un servidor por sockets."""
        self.parent = parent
        self.frame = tk.Frame(self.parent, bg="lightgreen")
        self.frame.pack(fill="x", padx=10, pady=10)

        # Área de texto para mostrar mensajes
        self.chat_display = scrolledtext.ScrolledText(self.frame, wrap=tk.WORD, state="disabled", width=40, height=10)
        self.chat_display.pack(pady=5)

        # Campo de entrada de mensajes
        self.message_entry = tk.Entry(self.frame, width=35)
        self.message_entry.pack(pady=5)
        self.message_entry.bind("<Return>", self.send_message)

        # Botón de enviar mensaje
        self.send_button = tk.Button(self.frame, text="Enviar", command=self.send_message)
        self.send_button.pack(pady=5)

        # Configuración del socket
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_address = ("127.0.0.1", 3333)

        try:
            self.client_socket.connect(self.server_address)
            threading.Thread(target=self.receive_messages, daemon=True).start()
        except:
            self.display_message("[ERROR] No se pudo conectar al servidor.")

    def send_message(self, event=None):
        """Envía un mensaje al servidor."""
        message = self.message_entry.get()
        if message:
            self.client_socket.send(message.encode("utf-8"))
            self.message_entry.delete(0, tk.END)

    def receive_messages(self):
        """Recibe mensajes del servidor y los muestra en la interfaz."""
        while True:
            try:
                message = self.client_socket.recv(1024).decode("utf-8")
                self.display_message(message)
            except:
                break

    def display_message(self, message):
        """Muestra un mensaje en la ventana de chat."""
        self.chat_display.config(state="normal")
        self.chat_display.insert(tk.END, message + "\n")
        self.chat_display.config(state="disabled")
        self.chat_display.see(tk.END)
