#!/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 'FechaRecibido' 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:
        # Verificar si la columna 'Enlace' existe
        check_enlace_query = f"""
            SELECT COUNT(*) 
            FROM information_schema.columns 
            WHERE table_schema = %s AND table_name = %s AND column_name = 'Enlace'
        """
        db_cursor.execute(check_enlace_query, (DB_CONFIG['database'], table_name))
        enlace_exists = db_cursor.fetchone()[0] > 0
        
        if enlace_exists:
            # Si existe, modificar el tipo a char(50)
            modify_enlace_query = f"""
                ALTER TABLE `{table_name}`
                MODIFY COLUMN Enlace char(50);
            """
            print(f"Modificando tabla '{table_name}': cambiando tipo de columna 'Enlace' a char(50)...")
            db_cursor.execute(modify_enlace_query)
        else:
            # Si no existe, agregar la columna como char(50)
            add_enlace_query = f"""
                ALTER TABLE `{table_name}`
                ADD COLUMN Enlace char(50)
                AFTER Protocolo;
            """
            print(f"Alterando tabla '{table_name}': agregando columna 'Enlace' como char(50)...")
            db_cursor.execute(add_enlace_query)
        
        # Verificar si el índice 'idx_enlace' existe
        check_index_query = f"""
            SELECT COUNT(*) 
            FROM information_schema.statistics 
            WHERE table_schema = %s AND table_name = %s AND index_name = 'idx_enlace'
        """
        db_cursor.execute(check_index_query, (DB_CONFIG['database'], table_name))
        index_exists = db_cursor.fetchone()[0] > 0
        
        if not index_exists:
            # Crear el índice si no existe
            create_index_query = f"""
                CREATE INDEX idx_enlace ON `{table_name}` (Enlace);
            """
            print(f"Creando índice 'idx_enlace' en tabla '{table_name}'...")
            db_cursor.execute(create_index_query)
        else:
            print(f"Índice 'idx_enlace' ya existe en tabla '{table_name}'.")

        # Verificar si la columna 'FechaRecibido' existe
        check_column_query = f"""
            SELECT COUNT(*) 
            FROM information_schema.columns 
            WHERE table_schema = %s AND table_name = %s AND column_name = 'FechaRecibido'
        """
        db_cursor.execute(check_column_query, (DB_CONFIG['database'], table_name))
        column_exists = db_cursor.fetchone()[0] > 0
        
        if column_exists:
            # Si existe, modificar el tipo a datetime
            modify_column_query = f"""
                ALTER TABLE `{table_name}`
                MODIFY COLUMN FechaRecibido datetime
                AFTER Enlace;
            """
            print(f"Modificando tabla '{table_name}': cambiando tipo de columna 'FechaRecibido' a datetime...")
            db_cursor.execute(modify_column_query)
        else:
            # Si no existe, agregar la columna como datetime
            add_column_query = f"""
                ALTER TABLE `{table_name}`
                ADD COLUMN FechaRecibido datetime
                AFTER Enlace;
            """
            print(f"Alterando tabla '{table_name}': agregando columna 'FechaRecibido' como datetime...")
            db_cursor.execute(add_column_query)

        print(f"Tabla '{table_name}' alterada exitosamente. Se procesaron los campos 'Enlace' y 'FechaRecibido'.")
    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_protocolo' 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()
