#!/usr/bin/env python3
"""
Script que busca tablas que comienzan con "temporal_" en una base de datos MySQL
y las altera para añadir un campo 'Protocolo' y un índice.
"""
import sys
import mysql.connector

# ---- Configuración de la base de datos ----
# Asegúrate de reemplazar estos valores con los de tu entorno
DB_CONFIG = {
   # 'host': 'base223.c8lcuo0a2bu6.us-east-1.rds.amazonaws.com',
    'host': '10.2.12.223',
    'user': 'gps',
    'password': 'p0o9i8u7',
    'database': 'gps_reportes',
    'charset': 'utf8mb4',
    'use_pure': True,
}

def get_temporal_tables(db_cursor):
    """
    Busca todas las tablas en la base de datos que comienzan con 'temporal_'.
    
    Args:
        db_cursor: Un cursor de la conexión a la base de datos.
    
    Returns:
        Una lista de nombres de tablas que cumplen con el criterio.
    """
    try:
        query = """
            SELECT table_name 
            FROM information_schema.tables 
            WHERE table_schema = %s AND table_name LIKE 'temporal_%%'
        """
        db_cursor.execute(query, (DB_CONFIG['database'],))
        tables = [row[0] for row in db_cursor.fetchall()]
        return tables
    except mysql.connector.Error as err:
        print(f"Error al obtener la lista de tablas: {err}", file=sys.stderr)
        return []

def alter_table_add_field_and_index(db_cursor, table_name):
    """
    Altera una tabla para agregar el campo 'Enlace' y su índice.
    
    Args:
        db_cursor: Un cursor de la conexión a la base de datos.
        table_name: El nombre de la tabla a modificar.
    """
    try:
        # Añadir la columna 'Protocolo' si no existe
        add_column_query = f"""
            ALTER TABLE `{table_name}`
            ADD COLUMN `Enlace` CHAR(50) DEFAULT NULL;
        """
        print(f"Alterando tabla '{table_name}': añadiendo columna 'Enlace'...")
        db_cursor.execute(add_column_query)
        
        # Añadir un índice al campo 'Protocolo' para optimizar búsquedas
        add_index_query = f"""
            CREATE INDEX `idx_enlace` ON `{table_name}` (`Enlace`);
        """
        print(f"Creando índice 'idx_enlace' en la tabla '{table_name}'...")
        db_cursor.execute(add_index_query)

        print(f"Tabla '{table_name}' alterada exitosamente. Se añadió el campo 'Enlace' y su índice.")
    except mysql.connector.Error as err:
        # Se maneja el error específico de que el índice ya existe
        if err.errno == 1061:  # ER_DUP_KEYNAME
            print(f"Índice 'idx_enlace' ya existe en la tabla '{table_name}'. Continuando...")
        else:
            print(f"Error al alterar la tabla '{table_name}': {err}", file=sys.stderr)
            # Rollback en caso de error
            db_cursor.connection.rollback()
            return False
    
    return True

def main():
    """
    Función principal que ejecuta el proceso.
    """
    conn = None
    try:
        print("Conectando a la base de datos...")
        conn = mysql.connector.connect(**DB_CONFIG)
        cursor = conn.cursor()
        print("Conexión exitosa. Buscando tablas 'temporal_'...")
        
        temporal_tables = get_temporal_tables(cursor)
        
        if not temporal_tables:
            print("No se encontraron tablas que comiencen con 'temporal_'. Saliendo.")
            return

        print(f"Se encontraron {len(temporal_tables)} tablas para modificar:")
        for table in temporal_tables:
            print(f"- {table}")
        
        for table_name in temporal_tables:
            if alter_table_add_field_and_index(cursor, table_name):
                # Realizar commit solo si la alteración fue exitosa para la tabla actual
                conn.commit()
            print("-" * 30)

    except mysql.connector.Error as err:
        if err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR:
            print("Error de autenticación: verifica tu usuario o contraseña.", file=sys.stderr)
        elif err.errno == mysql.connector.errorcode.ER_BAD_DB_ERROR:
            print("La base de datos no existe.", file=sys.stderr)
        else:
            print(f"Ocurrió un error inesperado: {err}", file=sys.stderr)
    finally:
        if conn and conn.is_connected():
            cursor.close()
            conn.close()
            print("Conexión a la base de datos cerrada.")

if __name__ == '__main__':
    main()
