import os
import sqlite3
import tkinter as tk
from tkinter import messagebox

# ConfiguraciÃ³n de la ruta de la base de datos
DB_PATH = os.path.join(os.path.dirname(__file__), "contactos.db")

def init_db() -> None:
    """Crea la base de datos y la tabla si no existen."""
    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.execute(
        """
        CREATE TABLE IF NOT EXISTS contactos (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nombre TEXT NOT NULL,
            grupo TEXT NOT NULL,
            telefono TEXT NOT NULL,
            UNIQUE(nombre, grupo, telefono)
        )
        """
    )
    conn.commit()
    conn.close()

def guardar_contacto() -> None:
    """Guarda un contacto nuevo; evita duplicados."""
    nombre = entry_nombre.get().strip()
    grupo = entry_grupo.get().strip()
    telefono = entry_telefono.get().strip()

    if not nombre or not grupo or not telefono:
        messagebox.showwarning("Campos incompletos", "Por favor completa todos los campos.")
        return

    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()

    try:
        c.execute(
            "INSERT INTO contactos (nombre, grupo, telefono) VALUES (?, ?, ?)",
            (nombre, grupo, telefono),
        )
        conn.commit()
        messagebox.showinfo("Guardado", "Contacto guardado correctamente.")
        limpiar_campos()
        cargar_contactos()
    except sqlite3.IntegrityError:
        messagebox.showwarning("Duplicado", "Este contacto ya existe.")
    finally:
        conn.close()

def buscar_contacto() -> None:
    """Busca por nombre o telÃ©fono usando el primer campo de entrada."""
    query = entry_nombre.get().strip()

    if not query:
        messagebox.showwarning("Buscar", "Ingresa un nombre o telÃ©fono en el campo 'Nombre'.")
        return

    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.execute(
        "SELECT nombre, grupo, telefono FROM contactos WHERE nombre LIKE ? OR telefono LIKE ? ORDER BY id LIMIT 1",
        (f"%{query}%", f"%{query}%"),
    )
    resultado = c.fetchone()
    conn.close()

    if resultado:
        nombre, grupo, telefono = resultado
        entry_nombre.delete(0, tk.END)
        entry_nombre.insert(0, nombre)
        entry_grupo.delete(0, tk.END)
        entry_grupo.insert(0, grupo)
        entry_telefono.delete(0, tk.END)
        entry_telefono.insert(0, telefono)
        
        # Resaltar en la lista
        for i in range(listbox.size()):
            if listbox.get(i).startswith(f"{nombre} | {grupo} | {telefono}"):
                listbox.selection_clear(0, tk.END)
                listbox.selection_set(i)
                listbox.see(i)
                break
    else:
        messagebox.showinfo("Resultado", "No se encontrÃ³ coincidencia.")

def cargar_contactos() -> None:
    """Refresca la lista de contactos."""
    listbox.delete(0, tk.END)
    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.execute("SELECT nombre, grupo, telefono FROM contactos ORDER BY nombre")
    for nombre, grupo, telefono in c.fetchall():
        listbox.insert(tk.END, f"{nombre} | {grupo} | {telefono}")
    conn.close()

def limpiar_campos() -> None:
    entry_nombre.delete(0, tk.END)
    entry_grupo.delete(0, tk.END)
    entry_telefono.delete(0, tk.END)
    entry_nombre.focus_set()

def on_double_click(event: tk.Event) -> None:
    selection = listbox.curselection()
    if selection:
        item = listbox.get(selection[0])
        messagebox.showinfo("Detalle del Contacto", item)

def main() -> None:
    global entry_nombre, entry_grupo, entry_telefono, listbox

    root = tk.Tk()
    root.title("Agenda de Contactos")
    root.geometry("480x420") # Un poco mÃ¡s de alto para comodidad

    frame = tk.Frame(root, padx=10, pady=10)
    frame.pack(fill=tk.BOTH, expand=True)

    # UI - Labels y Entrys
    tk.Label(frame, text="Nombre/Buscar:").grid(row=0, column=0, sticky="e")
    entry_nombre = tk.Entry(frame, width=30)
    entry_nombre.grid(row=0, column=1, pady=5, sticky="w")

    tk.Label(frame, text="Grupo:").grid(row=1, column=0, sticky="e")
    entry_grupo = tk.Entry(frame, width=30)
    entry_grupo.grid(row=1, column=1, pady=5, sticky="w")

    tk.Label(frame, text="TelÃ©fono:").grid(row=2, column=0, sticky="e")
    entry_telefono = tk.Entry(frame, width=30)
    entry_telefono.grid(row=2, column=1, pady=5, sticky="w")

    # Botones
    btn_guardar = tk.Button(frame, text="Guardar", command=guardar_contacto, width=15)
    btn_guardar.grid(row=3, column=0, pady=10)

    btn_buscar = tk.Button(frame, text="Buscar", command=buscar_contacto, width=15)
    btn_buscar.grid(row=3, column=1, pady=10)

    # Lista
    listbox = tk.Listbox(frame, width=60, height=10)
    listbox.grid(row=6, column=0, columnspan=2, pady=5, sticky="nsew")
    listbox.bind("<Double-Button-1>", on_double_click)

    init_db()
    cargar_contactos()
    entry_nombre.focus_set()

    root.mainloop()

if __name__ == "__main__":
    main()