import mysql.connector
import sys
import time
from datetime import datetime

# ---- Configuración de la base de datos ----
# Reemplaza con los datos del Servidor 2
DB_CONFIG = {
    'host': 'base220.c8lcuo0a2bu6.us-east-1.rds.amazonaws.com',
    'user': 'gps',
    'password': 'q1w2e3r4',
    'database': 'gps_reportes',
    'charset': 'utf8mb4',
    'use_pure': True,
}

# Definición de los índices a verificar y crear
# Se ha añadido la clave 'unique' para especificar si el índice debe ser UNIQUE.
REQUIRED_INDICES = {
    'id_disp': {
        'columns': ['Reporte_IdDisp'],
        'unique': True
    },
    'Reporte_NroMensaje_Reporte_FechaGPS': {
        'columns': ['Reporte_NroMensaje', 'Reporte_FechaGPS'],
        'unique': True
    },
    'fecha1': {
        'columns': ['Reporte_FechaServidor'],
        'unique': False
    },
    'fecha2': {
        'columns': ['Reporte_FechaGPS'],
        'unique': False
    },
    'puerto': {
        'columns': ['Reporte_Puerto'],
        'unique': False
    },
    'rus': {
        'columns': ['Reporte_RUS'],
        'unique': False
    },
    'ignicion': {
        'columns': ['Reporte_Ignicion'],
        'unique': False
    },
    'idxDisp_fecha': {
        'columns': ['Reporte_IdDisp','Reporte_FechaGPS'],
        'unique': False
    }
}
def log_status(cursor, table_name, description):
    """
    Inserta o actualiza un registro en la tabla arreglocolation.
    Si ya existe un registro para la tabla, lo actualiza. De lo contrario, lo inserta.
    """
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    # 1. Verificar si ya existe un registro para esta tabla
    check_query = "SELECT COUNT(*) FROM gps_reportes.arregloindice WHERE tabla = %s"
    cursor.execute(check_query, (table_name,))
    exists = cursor.fetchone()[0] > 0

    if exists:
        # 2. Si existe, actualizamos la fecha y la descripción
        update_query = "UPDATE gps_reportes.arregloindice SET fecha = NOW(), descripcion = %s WHERE tabla = %s"
        cursor.execute(update_query, (description, table_name))
        print(f"  -> Registro de la tabla '{table_name}' actualizado en el log.")
    else:
        # 3. Si no existe, insertamos un nuevo registro
        insert_query = "INSERT INTO gps_reportes.arregloindice (tabla, fecha, descripcion) VALUES (%s, NOW(), %s)"
        cursor.execute(insert_query, (table_name,  description))
        print(f"  -> Nuevo registro de la tabla '{table_name}' insertado en el log.")


def create_missing_indices():
    """
    Se conecta a la base de datos, itera sobre las tablas que comienzan con 'LOG_',
    y crea los índices faltantes basados en la configuración, incluyendo el tipo UNIQUE.
    """
    try:
        conn = mysql.connector.connect(**DB_CONFIG)
        cursor = conn.cursor()

        cursor.execute("SHOW TABLES LIKE 'LOG_%';")
        tables = [table[0] for table in cursor.fetchall()]

        if not tables:
            print("No se encontraron tablas que comiencen con 'LOG_'.")
            cursor.close()
            conn.close()
            return

        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Encontradas {len(tables)} tablas LOG_*. Verificando índices...")
        
        for table_name in tables:
            print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] Verificando índices para la tabla '{table_name}'...")
            
            cursor.execute(f"SHOW INDEX FROM {table_name};")
            existing_indices = {index[2] for index in cursor.fetchall()}
            
            for index_name, details in REQUIRED_INDICES.items():
                if index_name not in existing_indices:
                    columns_str = ", ".join(details['columns'])
                    
                    if details['unique']:
                        create_index_sql = f"CREATE UNIQUE INDEX {index_name} ON {table_name} ({columns_str});"
                    else:
                        create_index_sql = f"CREATE INDEX {index_name} ON {table_name} ({columns_str});"
                    
                    try:
                        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> Creando índice '{index_name}'...")
                        cursor.execute(create_index_sql)
                        conn.commit()
                        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> Índice '{index_name}' creado exitosamente.")
                        log_status(cursor, table_name, 'En la tabla '+table_name+' Índice '+ index_name +' creado exitosamente.')
                    except mysql.connector.Error as e:
                        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> [ERROR] Falló la creación del índice '{index_name}': {e}", file=sys.stderr)
                else:
                    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> El índice '{index_name}' ya existe. Saltando.")
                    log_status(cursor, table_name,  ' En la tabla '+table_name+' El índice '+index_name+' ya existe. Saltando.')

    except mysql.connector.Error as e:
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] [ERROR] Fallo en la conexión a la base de datos: {e}", file=sys.stderr)
    finally:
        if 'conn' in locals() and conn.is_connected():
            cursor.close()
            conn.close()
            print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] Conexión a la base de datos cerrada.")

if __name__ == "__main__":
    create_missing_indices()