import tkinter as tk
from tkinter import messagebox, ttk
import sqlite3
from datetime import datetime

class UsuariosApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Gestión de Usuarios")
        self.root.geometry("500x400")
        self.root.resizable(False, False)
        
        # Inicializar base de datos
        self.init_database()
        
        # Crear interfaz
        self.create_widgets()
    
    def init_database(self):
        """Inicializar la base de datos SQLite"""
        self.conn = sqlite3.connect('usuarios.db')
        self.cursor = self.conn.cursor()
        
        # Crear tabla si no existe
        self.cursor.execute('''
            CREATE TABLE IF NOT EXISTS usuarios (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                nombre TEXT NOT NULL,
                grupo TEXT NOT NULL,
                telefono TEXT UNIQUE NOT NULL,
                fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ''')
        self.conn.commit()
    
    def create_widgets(self):
        """Crear los widgets de la interfaz"""
        # Título
        titulo = tk.Label(self.root, text="Registro de Usuarios", font=("Arial", 16, "bold"))
        titulo.pack(pady=20)
        
        # Frame para los campos
        frame = tk.Frame(self.root)
        frame.pack(padx=20, pady=10, fill=tk.BOTH, expand=True)
        
        # Nombre
        tk.Label(frame, text="Nombre:", font=("Arial", 10)).grid(row=0, column=0, sticky="w", pady=10)
        self.nombre_var = tk.StringVar()
        self.nombre_entry = tk.Entry(frame, textvariable=self.nombre_var, width=30, font=("Arial", 10))
        self.nombre_entry.grid(row=0, column=1, padx=10, pady=10)
        
        # Grupo
        tk.Label(frame, text="Grupo:", font=("Arial", 10)).grid(row=1, column=0, sticky="w", pady=10)
        self.grupo_var = tk.StringVar()
        self.grupo_entry = tk.Entry(frame, textvariable=self.grupo_var, width=30, font=("Arial", 10))
        self.grupo_entry.grid(row=1, column=1, padx=10, pady=10)
        
        # Teléfono
        tk.Label(frame, text="Teléfono:", font=("Arial", 10)).grid(row=2, column=0, sticky="w", pady=10)
        self.telefono_var = tk.StringVar()
        self.telefono_entry = tk.Entry(frame, textvariable=self.telefono_var, width=30, font=("Arial", 10))
        self.telefono_entry.grid(row=2, column=1, padx=10, pady=10)
        
        # Frame para botones
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=20)
        
        # Botón Guardar
        guardar_btn = tk.Button(button_frame, text="Guardar Usuario", command=self.guardar_usuario, 
                               bg="#4CAF50", fg="white", font=("Arial", 10), padx=20, pady=10)
        guardar_btn.pack(side=tk.LEFT, padx=10)
        
        # Botón Ver Usuarios
        ver_btn = tk.Button(button_frame, text="Ver Usuarios", command=self.ver_usuarios,
                           bg="#2196F3", fg="white", font=("Arial", 10), padx=20, pady=10)
        ver_btn.pack(side=tk.LEFT, padx=10)
        
        # Botón Limpiar
        limpiar_btn = tk.Button(button_frame, text="Limpiar", command=self.limpiar_campos,
                               bg="#FF9800", fg="white", font=("Arial", 10), padx=20, pady=10)
        limpiar_btn.pack(side=tk.LEFT, padx=10)
    
    def guardar_usuario(self):
        """Guardar un nuevo usuario en la base de datos"""
        nombre = self.nombre_var.get().strip()
        grupo = self.grupo_var.get().strip()
        telefono = self.telefono_var.get().strip()
        
        # Validar que los campos no estén vacíos
        if not nombre or not grupo or not telefono:
            messagebox.showerror("Error", "Todos los campos son requeridos")
            return
        
        # Validar que el teléfono solo contenga números
        if not telefono.isdigit():
            messagebox.showerror("Error", "El teléfono debe contener solo números")
            return
        
        try:
            # Intentar insertar el usuario
            self.cursor.execute('''
                INSERT INTO usuarios (nombre, grupo, telefono)
                VALUES (?, ?, ?)
            ''', (nombre, grupo, telefono))
            self.conn.commit()
            
            messagebox.showinfo("Éxito", f"Usuario {nombre} registrado correctamente")
            self.limpiar_campos()
            
        except sqlite3.IntegrityError:
            messagebox.showerror("Error", f"El teléfono {telefono} ya está registrado.\nNo se permiten duplicados.")
        except Exception as e:
            messagebox.showerror("Error", f"Ocurrió un error: {str(e)}")
    
    def ver_usuarios(self):
        """Mostrar todos los usuarios registrados"""
        try:
            self.cursor.execute('SELECT nombre, grupo, telefono FROM usuarios ORDER BY fecha_registro DESC')
            usuarios = self.cursor.fetchall()
            
            if not usuarios:
                messagebox.showinfo("Usuarios", "No hay usuarios registrados")
                return
            
            # Crear ventana para mostrar usuarios
            ventana_usuarios = tk.Toplevel(self.root)
            ventana_usuarios.title("Lista de Usuarios")
            ventana_usuarios.geometry("500x400")
            
            # Crear tabla
            columns = ("Nombre", "Grupo", "Teléfono")
            tree = ttk.Treeview(ventana_usuarios, columns=columns, height=15)
            tree.column("#0", width=0, stretch=tk.NO)
            tree.column("Nombre", anchor=tk.W, width=150)
            tree.column("Grupo", anchor=tk.W, width=150)
            tree.column("Teléfono", anchor=tk.W, width=150)
            
            tree.heading("#0", text="", anchor=tk.W)
            tree.heading("Nombre", text="Nombre", anchor=tk.W)
            tree.heading("Grupo", text="Grupo", anchor=tk.W)
            tree.heading("Teléfono", text="Teléfono", anchor=tk.W)
            
            # Insertar dados
            for usuario in usuarios:
                tree.insert(parent='', index='end', iid=usuario[2], text='',
                           values=(usuario[0], usuario[1], usuario[2]))
            
            # Agregar scrollbar
            scrollbar = ttk.Scrollbar(ventana_usuarios, orient=tk.VERTICAL, command=tree.yview)
            tree.configure(yscroll=scrollbar.set)
            
            tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10, pady=10)
            scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
            
            # Información
            info_label = tk.Label(ventana_usuarios, text=f"Total de usuarios registrados: {len(usuarios)}", 
                                 font=("Arial", 10))
            info_label.pack(pady=10)
            
        except Exception as e:
            messagebox.showerror("Error", f"Error al obtener usuarios: {str(e)}")
    
    def limpiar_campos(self):
        """Limpiar los campos de entrada"""
        self.nombre_var.set("")
        self.grupo_var.set("")
        self.telefono_var.set("")
        self.nombre_entry.focus()
    
    def __del__(self):
        """Cerrar la conexión a la base de datos"""
        if hasattr(self, 'conn'):
            self.conn.close()

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