import threading
import socket
import mysql.connector
import tkinter as tk
from tkinter import scrolledtext, messagebox

# ---------------- Configuración ----------------
DB_HOST     = "10.2.12.220"
DB_USER     = "gps"
DB_PASSWORD = "q1w2e3r4"
DB_NAME     = "gps_reportes"
DNS         = "nlb-recepcion-tcp-98af84506c9b42a6.elb.us-east-1.amazonaws.com"
PUERTO      = 7001

LIMIT_RANDOM = 100
LIMIT_IDDISP = 50

# Flag global para detener el proceso
stop_event = threading.Event()

def log(msg):
    txt_log.configure(state='normal')
    txt_log.insert(tk.END, msg + "\n")
    txt_log.see(tk.END)
    txt_log.configure(state='disabled')

def worker(imei):
    """Hilo trabajador para consultar BD y enviar paquetes."""
    try:
        conn = mysql.connector.connect(
            host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME
        )
        cursor = conn.cursor()
    except Exception as e:
        messagebox.showerror("Error DB", str(e))
        btn_start.configure(state='normal')
        btn_stop.configure(state='disabled')
        return

    # Obtener lista de dispositivos
    if imei:
        log(f"🔍 Buscando registros de IMEI {imei}")
        cursor.execute(
            "SELECT reporte_iddisp FROM ultima_posicion "
            "WHERE reporte_iddisp=%s "
            "ORDER BY reporte_fechagps DESC "
            "LIMIT %s",
            (imei, LIMIT_IDDISP)
        )
        disp_ids = [r[0] for r in cursor.fetchall()]
    else:
        log("🎲 Modo random, obteniendo últimos dispositivos...")
        cursor.execute(
            "SELECT reporte_iddisp FROM ultima_posicion "
            "ORDER BY reporte_fechagps DESC "
            "LIMIT %s",
            (LIMIT_RANDOM,)
        )
        disp_ids = [r[0] for r in cursor.fetchall()]

    if not disp_ids:
        log("⚠️ No hay dispositivos para procesar.")
    else:
        contador = 0
        for disp in disp_ids:
            if stop_event.is_set():
                log("⏹️ Proceso detenido por el usuario.")
                break

            log(f"🔄 Procesando LOG_{disp}...")
            # Consulta de reporte_completo
            cursor.execute(
                f"SELECT reporte_completo FROM LOG_{disp} "
                "ORDER BY reporte_fechagps DESC LIMIT %s",
                (imei and LIMIT_IDDISP or LIMIT_RANDOM,)
            )
            rows = cursor.fetchall()

            for (reporte,) in rows:
                if stop_event.is_set():
                    break

                contador += 1
                # Extraer timestamp (primeros 14 caracteres AAAAMMDDhhmmss)
                timestamp = reporte[:14]
                try:
                    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
                        sock.settimeout(2)
                        sock.connect((DNS, PUERTO))
                        sock.sendall(reporte.encode())
                    log(f"  ✓ Paquete #{contador} enviado para LOG_{disp} (ts: {timestamp})")
                except Exception as ex:
                    log(f"  ❌ Error al enviar paquete #{contador} para LOG_{disp}: {ex}")

        log(f"✔️ Trabajo finalizado. Total de paquetes enviados: {contador}")

    cursor.close()
    conn.close()

    # Reactivar botones
    btn_start.configure(state='normal')
    btn_stop.configure(state='disabled')

def start_thread():
    """Inicia el hilo de envío y gestiona botones."""
    stop_event.clear()
    txt_log.configure(state='normal')
    txt_log.delete(1.0, tk.END)
    txt_log.configure(state='disabled')

    imei = entry_id.get().strip()
    btn_start.configure(state='disabled')
    btn_stop.configure(state='normal')

    t = threading.Thread(target=worker, args=(imei,), daemon=True)
    t.start()

def stop_thread():
    """Marca la señal de detención para el hilo."""
    stop_event.set()
    btn_stop.configure(state='disabled')
    log("⏳ Deteniendo el proceso...")

# --- GUI Setup ---
root = tk.Tk()
root.title("Envío de Reportes GPS")

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

tk.Label(frame, text="IMEI (opcional):").grid(row=0, column=0, sticky='w')
entry_id = tk.Entry(frame, width=30)
entry_id.grid(row=0, column=1, padx=5, pady=5)

btn_start = tk.Button(frame, text="Iniciar envío", command=start_thread)
btn_start.grid(row=0, column=2, padx=5)

btn_stop = tk.Button(frame, text="Detener envío", command=stop_thread, state='disabled')
btn_stop.grid(row=0, column=3, padx=5)

txt_log = scrolledtext.ScrolledText(frame, width=80, height=20, state='disabled')
txt_log.grid(row=1, column=0, columnspan=4, pady=10)

root.mainloop()
