#!/usr/bin/env python3
"""
send_reports_loop.py

Script que:
1. Se conecta periódicamente a la base de datos MySQL RDS (gps_reportes).
2. Extrae los últimos REPORT_LIMIT registros de la tabla `ultima_posicion`.
3. Envía cada Reporte_Completo individualmente por TCP al balanceador de carga.
4. Imprime en pantalla el progreso de cada paso.
5. Se ejecuta en un bucle infinito, con un retardo configurable entre iteraciones.
"""

import mysql.connector
import socket
import sys
import time

# ---- Configuración de la base de datos ----
DB_CONFIG = {
    'host': '10.2.12.220',
    'user': 'gps',
    'password': 'q1w2e3r4',
    'database': 'gps_reportes',
    'port': 3306
}

# ---- Configuración del balanceador de carga ----

BALANCER_HOST = 'accb08567c6f45c0e.awsglobalaccelerator.com'

BALANCER_HOST = 'gpsaws2.divisiongps.com.ar'
#BALANCER_HOST = 'nlb-recepcion-tcp-98af84506c9b42a6.elb.us-east-1.amazonaws.com'  # <- Reemplaza con tu host
BALANCER_PORT = 6019

# ---- Parámetros del script ----
REPORT_LIMIT = 10000     # Cuántos reportes traer en cada iteración
SLEEP_INTERVAL = 1      # Segundos de espera entre cada bucle completo

def fetch_reports(limit=REPORT_LIMIT):
    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Conectando a la BD para obtener hasta {limit} reportes...")
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor()
    query = """
        SELECT Reporte_Completo
        FROM (
            SELECT Reporte_Completo, Reporte_Fechagps
            FROM ultima_posicion
            ORDER BY Reporte_Fechagps DESC
            LIMIT %s
        ) AS sub
        ORDER BY Reporte_Fechagps DESC;
    """
    cursor.execute(query, (limit,))
    rows = cursor.fetchall()
    cursor.close()
    conn.close()
    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Recuperados {len(rows)} reportes.")
    return [row[0] for row in rows]

def send_reports(reports):
    total = len(reports)
    for i, report in enumerate(reports, start=1):
        try:
            with socket.create_connection((BALANCER_HOST, BALANCER_PORT), timeout=1) as sock:
                sock.sendall(report.encode('utf-8'))
            print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Enviado {i}/{total}")
        except Exception as e:
            print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] [ERROR] Al enviar reporte {i}/{total}: {e}", file=sys.stderr)
            # Continuar con el siguiente reporte
            continue

def main_loop():
    print("Iniciando bucle de envío de reportes. Presiona Ctrl+C para detener.")
    try:
        while True:
            reports = fetch_reports()
            if reports:
                print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Enviando lote de {len(reports)} reportes...")
                send_reports(reports)
                print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Lote enviado. Durmiendo {SLEEP_INTERVAL}s...\n")
            else:
                print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] No hay reportes para enviar. Durmiendo {SLEEP_INTERVAL}s...\n")
            time.sleep(SLEEP_INTERVAL)
    except KeyboardInterrupt:
        print("\nProceso interrumpido por el usuario. Saliendo...")
        sys.exit(0)

if __name__ == "__main__":
    main_loop()

"""
Instrucciones:
1. Guarda este código en send_reports_loop.py
2. Instala dependencias: pip install mysql-connector-python
3. Ajusta BALANCER_HOST si es necesario.
4. Ejecuta: python3 send_reports_loop.py
"""

