import mysql.connector
from datetime import datetime, timedelta

# Configuración de la conexión a la base de datos
DB_CONFIG = {
    'host': '10.2.12.220',
    'user': 'gps',
    'password': 'q1w2e3r4',
    'database': 'gps_reportes',
    'charset': 'utf8mb4',
    'use_pure': True,
}

def registrar_accion(cursor, nombre_tabla, accion):
    """Inserta un registro de la acción en la tabla de auditoría."""
    query = "INSERT INTO limpieza_tablas (fecha_registro, nombre_tabla, accion) VALUES (%s, %s, %s)"
    data = (datetime.now(), nombre_tabla, accion)
    cursor.execute(query, data)

def limpiar_tablas():
    try:
        # Establece un timeout de 4 horas (14400 segundos) para la conexión
        cnx = mysql.connector.connect(connect_timeout=14400, **DB_CONFIG)
        cursor = cnx.cursor()

        # Consulta que trae solo las tablas que no se han procesado en los últimos 7 días
        query_show_tables = """
            SELECT
                T.table_name
            FROM
                INFORMATION_SCHEMA.TABLES AS T
            LEFT JOIN
                limpieza_tablas AS L ON T.table_name = L.nombre_tabla
            WHERE
                T.table_schema = 'gps_reportes'
            AND
                T.table_name LIKE 'LOG_%'
            AND
                T.table_name NOT LIKE 'LOG_E%'
            GROUP BY
                T.table_name
            HAVING
                MAX(L.fecha_registro) IS NULL OR MAX(L.fecha_registro) < NOW() - INTERVAL 7 DAY
            ORDER BY
                T.table_name DESC;
        """
        cursor.execute(query_show_tables)
        
        tablas_a_procesar = [row[0] for row in cursor.fetchall()]
        
        i = 1  # Contador para tablas limpiadas
        j = 1  # Contador para tablas eliminadas
        
        if not tablas_a_procesar:
            print("No hay tablas para procesar en este momento.")
            return

        for tabla in tablas_a_procesar:
            print(f"// Procesando tabla: {tabla} //")

            # Verifica si la tabla tiene datos
            query_check_min_date = f"SELECT MIN(Reporte_FechaGPS) FROM `{tabla}`"
            cursor.execute(query_check_min_date)
            min_date = cursor.fetchone()[0]

            if min_date:
                # La tabla tiene datos
                fecha_actual = datetime.now()
                fecha_comparar = fecha_actual - timedelta(days=365)
                print(f"fecha a comprar {fecha_comparar}, fecha minima de la tabla {min_date} .")
                
                if min_date < fecha_comparar:
                    # La fecha más antigua es menor a 365 días
                    query_delete = f"""
                        DELETE FROM `{tabla}` 
                        WHERE DATEDIFF(NOW(), Reporte_FechaGPS) > 365
                    """
                    cursor.execute(query_delete)
                    registrar_accion(cursor, tabla, 'datos limpiados')
                    print(f"Tabla {tabla} limpiada correctamente.")
                    i += 1
                else:
                    # No hay datos antiguos para limpiar
                    registrar_accion(cursor, tabla, 'datos actuales')
                    print(f"TABLA con datos más actuales {tabla} (no se limpia).")

            else:
                # La tabla está vacía, se puede eliminar
                query_drop_table = f"DROP TABLE `{tabla}`"
                cursor.execute(query_drop_table)
                registrar_accion(cursor, tabla, 'tabla borrada')
                print(f"TABLA {tabla} borrada correctamente.")
                j += 1
                
            cnx.commit()

            if i >= 300:
                print(f"{i-1} Tablas fueron limpiadas, finalizando.")
                break
            
            if j >= 200:
                print(f"{j-1} Tablas fueron dropeadas, finalizando.")
                break
                
    except mysql.connector.Error as err:
        print(f"Error: {err}")
    finally:
        if 'cnx' in locals() and cnx.is_connected():
            cursor.close()
            cnx.close()
            print("Conexión a la base de datos cerrada.")

# Ejecuta la función
limpiar_tablas()