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

class BuscadorUsuarios:
    def __init__(self, root):
        self.root = root
        self.root.title("Buscador de Usuarios")
        self.root.geometry("700x500")
        self.root.resizable(False, False)
        
        # Conectar con la base de datos
        self.conectar_db()
        
        # Crear interfaz
        self.create_widgets()
    
    def conectar_db(self):
        """Conectar con la base de datos existente"""
        try:
            self.conn = sqlite3.connect('usuarios.db')
            self.cursor = self.conn.cursor()
            
            # Verificar que la tabla existe
            self.cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='usuarios'")
            if not self.cursor.fetchone():
                messagebox.showerror("Error", "La base de datos no existe. Primero debes crear usuarios en la aplicación principal.")
                self.root.destroy()
        except Exception as e:
            messagebox.showerror("Error de Conexión", f"No se pudo conectar a la base de datos: {str(e)}")
            self.root.destroy()
    
    def create_widgets(self):
        """Crear los widgets de la interfaz"""
        # Título
        titulo = tk.Label(self.root, text="Buscador de Usuarios", font=("Arial", 16, "bold"))
        titulo.pack(pady=20)
        
        # Frame para búsqueda
        search_frame = tk.Frame(self.root)
        search_frame.pack(padx=20, pady=10, fill=tk.X)
        
        # Etiqueta de búsqueda
        tk.Label(search_frame, text="Buscar por:", font=("Arial", 10)).pack(side=tk.LEFT, padx=5)
        
        # ComboBox para seleccionar tipo de búsqueda
        self.tipo_busqueda = ttk.Combobox(search_frame, values=["Nombre", "Grupo", "Teléfono"], 
                                         state="readonly", width=15, font=("Arial", 10))
        self.tipo_busqueda.set("Nombre")
        self.tipo_busqueda.pack(side=tk.LEFT, padx=5)
        
        # Campo de búsqueda
        tk.Label(search_frame, text="Criterio:", font=("Arial", 10)).pack(side=tk.LEFT, padx=5)
        self.busqueda_var = tk.StringVar()
        self.busqueda_entry = tk.Entry(search_frame, textvariable=self.busqueda_var, width=30, font=("Arial", 10))
        self.busqueda_entry.pack(side=tk.LEFT, padx=5)
        
        # Botón Buscar
        buscar_btn = tk.Button(search_frame, text="Buscar", command=self.buscar, 
                              bg="#2196F3", fg="white", font=("Arial", 10), padx=15)
        buscar_btn.pack(side=tk.LEFT, padx=5)
        
        # Botón Limpiar búsqueda
        limpiar_btn = tk.Button(search_frame, text="Limpiar", command=self.limpiar_busqueda,
                               bg="#FF9800", fg="white", font=("Arial", 10), padx=15)
        limpiar_btn.pack(side=tk.LEFT, padx=5)
        
        # Frame para la tabla
        table_frame = tk.Frame(self.root)
        table_frame.pack(padx=20, pady=10, fill=tk.BOTH, expand=True)
        
        # Crear tabla con scrollbar
        columns = ("Nombre", "Grupo", "Teléfono", "Fecha Registro")
        self.tree = ttk.Treeview(table_frame, columns=columns, height=15)
        self.tree.column("#0", width=0, stretch=tk.NO)
        self.tree.column("Nombre", anchor=tk.W, width=150)
        self.tree.column("Grupo", anchor=tk.W, width=120)
        self.tree.column("Teléfono", anchor=tk.W, width=120)
        self.tree.column("Fecha Registro", anchor=tk.W, width=180)
        
        self.tree.heading("#0", text="", anchor=tk.W)
        self.tree.heading("Nombre", text="Nombre", anchor=tk.W)
        self.tree.heading("Grupo", text="Grupo", anchor=tk.W)
        self.tree.heading("Teléfono", text="Teléfono", anchor=tk.W)
        self.tree.heading("Fecha Registro", text="Fecha Registro", anchor=tk.W)
        
        # Scrollbar
        scrollbar = ttk.Scrollbar(table_frame, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscroll=scrollbar.set)
        
        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # Frame para información
        info_frame = tk.Frame(self.root)
        info_frame.pack(padx=20, pady=10, fill=tk.X)
        
        self.info_label = tk.Label(info_frame, text="Resultados: 0", font=("Arial", 10))
        self.info_label.pack(side=tk.LEFT)
        
        # Botón Ver todos
        todos_btn = tk.Button(info_frame, text="Ver Todos los Usuarios", command=self.ver_todos,
                             bg="#4CAF50", fg="white", font=("Arial", 10), padx=15)
        todos_btn.pack(side=tk.RIGHT)
        
        # Permitir búsqueda al presionar Enter
        self.busqueda_entry.bind("<Return>", lambda event: self.buscar())
    
    def buscar(self):
        """Realizar búsqueda en la base de datos"""
        criterio_busqueda = self.busqueda_var.get().strip()
        tipo = self.tipo_busqueda.get()
        
        if not criterio_busqueda:
            messagebox.showwarning("Advertencia", "Por favor ingresa un criterio de búsqueda")
            return
        
        try:
            # Limpiar tabla
            for item in self.tree.get_children():
                self.tree.delete(item)
            
            # Mapear tipo de búsqueda a columna
            columnas = {"Nombre": "nombre", "Grupo": "grupo", "Teléfono": "telefono"}
            columna = columnas[tipo]
            
            # Realizar búsqueda (LIKE para búsqueda flexible)
            query = f"SELECT nombre, grupo, telefono, fecha_registro FROM usuarios WHERE {columna} LIKE ?"
            self.cursor.execute(query, (f"%{criterio_busqueda}%",))
            resultados = self.cursor.fetchall()
            
            if not resultados:
                messagebox.showinfo("Sin Resultados", f"No se encontraron usuarios que coincidan con '{criterio_busqueda}'")
                self.info_label.config(text="Resultados: 0")
                return
            
            # Insertar resultados en la tabla
            for usuario in resultados:
                self.tree.insert(parent='', index='end', iid=usuario[2], text='',
                               values=(usuario[0], usuario[1], usuario[2], usuario[3]))
            
            # Actualizar información
            self.info_label.config(text=f"Resultados: {len(resultados)}")
            messagebox.showinfo("Búsqueda Completada", f"Se encontraron {len(resultados)} usuario(s)")
            
        except Exception as e:
            messagebox.showerror("Error", f"Error al buscar: {str(e)}")
    
    def ver_todos(self):
        """Mostrar todos los usuarios de la base de datos"""
        try:
            # Limpiar tabla
            for item in self.tree.get_children():
                self.tree.delete(item)
            
            # Obtener todos los usuarios
            self.cursor.execute("SELECT nombre, grupo, telefono, fecha_registro FROM usuarios ORDER BY fecha_registro DESC")
            usuarios = self.cursor.fetchall()
            
            if not usuarios:
                messagebox.showinfo("Sin Datos", "No hay usuarios registrados en la base de datos")
                self.info_label.config(text="Resultados: 0")
                return
            
            # Insertar usuarios en la tabla
            for usuario in usuarios:
                self.tree.insert(parent='', index='end', iid=usuario[2], text='',
                               values=(usuario[0], usuario[1], usuario[2], usuario[3]))
            
            # Actualizar información
            self.info_label.config(text=f"Total de usuarios: {len(usuarios)}")
            
        except Exception as e:
            messagebox.showerror("Error", f"Error al obtener usuarios: {str(e)}")
    
    def limpiar_busqueda(self):
        """Limpiar campo de búsqueda y resultados"""
        self.busqueda_var.set("")
        for item in self.tree.get_children():
            self.tree.delete(item)
        self.info_label.config(text="Resultados: 0")
        self.busqueda_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 = BuscadorUsuarios(root)
    root.mainloop()
