import mysql.connector
import sys
import time

# ---- Configuración de los servidores ----
# Reemplaza con los datos de conexión de tu Servidor 1 (fuente)
DB_CONFIG_SERVER1 = {
    'host': '10.2.12.226',
    'user': 'gps',
    'password': 'q1w2e3r4',
    'database': 'gps_reportes',
    'charset': 'utf8mb4',
    'use_pure': True,
}

# Reemplaza con los datos de conexión de tu Servidor 2 (destino)
DB_CONFIG_SERVER2 = {
    'host': 'base220.c8lcuo0a2bu6.us-east-1.rds.amazonaws.com',
    'user': 'gps',
    'password': 'q1w2e3r4',
    'database': 'gps_reportes',
    'charset': 'utf8mb4',
    'use_pure': True,
}

# Plantilla de la sentencia CREATE TABLE para las tablas LOG_
# Se usa un placeholder {table_name} para insertar el nombre de la tabla dinámicamente.
CREATE_TABLE_TEMPLATE = """
CREATE TABLE `{table_name}` (
    `IdReporte` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `Reporte_IdDisp` varchar(30) DEFAULT NULL,
    `Reporte_FechaGPS` datetime DEFAULT NULL,
    `Reporte_FechaServidor` datetime DEFAULT NULL,
    `Reporte_Velocidad` decimal(18,2) DEFAULT NULL,
    `Reporte_Rumbo` int(11) DEFAULT NULL,
    `Reporte_Latitud` varchar(50) DEFAULT NULL,
    `Reporte_Longitud` varchar(50) DEFAULT NULL,
    `Reporte_Evento` varchar(2) DEFAULT NULL,
    `Reporte_EventoDescripcion` varchar(100) DEFAULT NULL,
    `Reporte_Entradas` varchar(20) DEFAULT NULL,
    `Reporte_Edad` varchar(4) DEFAULT NULL,
    `Reporte_Completo` varchar(1000) DEFAULT NULL,
    `Reporte_Puerto` varchar(45) DEFAULT NULL,
    `Reporte_PC` varchar(45) DEFAULT NULL,
    `Reporte_AlertaProcesada` int(11) DEFAULT NULL,
    `Reporte_NroMensaje` varchar(45) DEFAULT NULL,
    `Reporte_Val1` varchar(45) DEFAULT NULL,
    `Reporte_Val2` varchar(45) DEFAULT NULL,
    `Reporte_Val3` varchar(45) DEFAULT NULL,
    `Reporte_Val4` varchar(300) DEFAULT NULL,
    `Reporte_RUS` int(11) DEFAULT NULL,
    `Reporte_Direccion` varchar(400) DEFAULT NULL,
    `Reporte_Ignicion` varchar(2) DEFAULT NULL,
    `Reporte_Mileage` decimal(10,1) DEFAULT NULL,
    PRIMARY KEY (`IdReporte`),
     KEY `id_disp` (`Reporte_IdDisp`),
    UNIQUE KEY `Reporte_NroMensaje_Reporte_FechaGPS` (`Reporte_NroMensaje`,`Reporte_FechaGPS`),
    KEY `fecha1` (`Reporte_FechaServidor`),
    KEY `fecha2` (`Reporte_FechaGPS`),
    KEY `latitud` (`Reporte_Latitud`),
    KEY `longitud` (`Reporte_Longitud`),
    KEY `puerto` (`Reporte_Puerto`),
    KEY `rus` (`Reporte_RUS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""

def get_log_table_names(db_config):
    """
    Se conecta al Servidor 1 y recupera los nombres de las tablas
    que comienzan con 'LOG_'.
    """
    table_names = []
    try:
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor()

        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Conectado a Servidor 1.")
        
        # Obtener todas las tablas que coinciden con el patrón 'LOG_'
        cursor.execute("SHOW TABLES LIKE 'LOG_%';")
        table_names = [table[0] for table in cursor.fetchall()]

        if not table_names:
            print("No se encontraron tablas que comiencen con 'LOG_' en Servidor 1.")
            return []

        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Encontradas {len(table_names)} tablas.")

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

def create_tables_on_server2(db_config, table_names):
    """
    Se conecta al Servidor 2 y ejecuta las sentencias CREATE TABLE
    usando la plantilla.
    """
    if not table_names:
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] No hay tablas para crear en Servidor 2.")
        return

    try:
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor()

        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Conectado a Servidor 2.")
        
        for table_name in table_names:
            # Reemplazar el placeholder con el nombre real de la tabla
            create_sql = CREATE_TABLE_TEMPLATE.format(table_name=table_name)
            
            try:
                print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> Intentando crear la tabla '{table_name}'...")
                cursor.execute(create_sql)
                conn.commit()
                print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> Tabla '{table_name}' creada exitosamente.")
            except mysql.connector.Error as e:
                # Error 1050 significa que la tabla ya existe
                if e.errno == 1050:
                    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> La tabla '{table_name}' ya existe. Saltando.")
                else:
                    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}]  -> [ERROR] Fallo al crear la tabla '{table_name}': {e}", file=sys.stderr)

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

def main():
    """Bucle principal de ejecución."""
    print("Iniciando script para replicar tablas LOG_ de Servidor 1 a Servidor 2 con plantilla fija...")
    
    # Obtener los nombres de las tablas del Servidor 1
    table_names = get_log_table_names(DB_CONFIG_SERVER1)
    
    # Crear las tablas en el Servidor 2
    create_tables_on_server2(DB_CONFIG_SERVER2, table_names)
    
    print("\nProceso completado.")

if __name__ == "__main__":
    main()
