# -*- coding: utf-8 -*-
import sys
import mysql.connector
from netmiko import ConnectHandler
import time

# --- CONFIGURACION DE BASE DE DATOS ---
import re, os
import re, os
import os
import os
import os
import os
import os
def __get_db_config_dynamic():
    cfg = {'host': '127.0.0.1', 'user': 'saas_admin', 'password': 'AdminSaaS2026!', 'database': 'adminolt_db'}
    for db_path in ['/var/www/html/db.php', '/root/Workspace360_paquete/db.php']:
        try:
            if os.path.exists(db_path):
                with open(db_path, 'r', encoding='utf-8', errors='ignore') as f:
                    for line in f:
                        line = line.strip()
                        if line.startswith('$host') and '=' in line:
                            part = line.split("'")[1] if "'" in line else line.split('"')[1]
                            cfg['host'] = '127.0.0.1' if part == 'localhost' else part
                        elif line.startswith('$user') and '=' in line:
                            cfg['user'] = line.split("'")[1] if "'" in line else line.split('"')[1]
                        elif line.startswith('$pass') and '=' in line:
                            cfg['password'] = line.split("'")[1] if "'" in line else line.split('"')[1]
                        elif line.startswith('$db') and '=' in line:
                            cfg['database'] = line.split("'")[1] if "'" in line else line.split('"')[1]
                break
        except: pass
    return cfg
DB_CONFIG = __get_db_config_dynamic()

def get_olt_credentials(olt_id):
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor(dictionary=True)
    cursor.execute("SELECT ip_address, ssh_user, ssh_pass, ssh_port FROM olts WHERE id = %s", (olt_id,))
    olt = cursor.fetchone()
    conn.close()
    return olt

# Funcin robusta para manejar confirmaciones automticas (y/n) de Huawei
def send_huawei_cmd(conn, cmd):
    out = conn.send_command_timing(cmd)
    if "(y/n)" in out.lower() or "confirm" in out.lower():
        out += conn.send_command_timing("y")
    return out

def push_config():
    if len(sys.argv) < 3:
        print("Error: Faltan argumentos crticos para la ejecucin.")
        sys.exit(1)

    olt_id = sys.argv[1]
    action = sys.argv[2]
    
    olt_data = get_olt_credentials(olt_id)
    if not olt_data:
        print("Error: Credenciales no encontradas.")
        sys.exit(1)

    device = {
        'device_type': 'huawei_smartax', # <--- ESTE ES EL CAMBIO CLAVE PARA OLTs
        'host': olt_data['ip_address'],
        'username': olt_data['ssh_user'],
        'password': olt_data['ssh_pass'],
        'port': olt_data['ssh_port'],
        'global_delay_factor': 2
    }

    try:
        conn = ConnectHandler(**device)
        conn.enable()
        conn.config_mode()

        if action == "vlan":
            vlan_id = sys.argv[3]
            v_type = sys.argv[4]
            out = send_huawei_cmd(conn, f"vlan {vlan_id} {v_type}")
            print(f"VLAN Output: {out}")
            
        elif action == "speed":
            # Parmetros SIMTRICOS recibidos desde PHP
            t_id = sys.argv[3]
            cir = sys.argv[4]
            pir = sys.argv[5]

            # Inyectar un nico Perfil de Velocidad Simtrico
            cmd = f"traffic table ip index {t_id} cir {cir} pir {pir} priority 0 priority-policy tag-In-Package"
            out = send_huawei_cmd(conn, cmd)
            print(f"Speed Simtrico Output: {out}")

        # Guardar en la memoria fsica de la OLT
        conn.send_command_timing("save")
        conn.disconnect()

    except Exception as e:
        print(f"Excepcin de red o de sintaxis: {e}")
        sys.exit(1)

if __name__ == "__main__":
    push_config()
