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

# --- CONFIGURACION DEV ---
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_olts():
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor(dictionary=True)
    cursor.execute("SELECT id, nombre, ip_address, ssh_user, ssh_pass, ssh_port FROM olts")
    olts = cursor.fetchall()
    conn.close()
    return olts

def save_vlan(olt_id, vlan_id, v_type, desc):
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor()
    
    # Si la VLAN ya existe, actualizamos su tipo, pero respetamos la descripcion si ya fue editada (opcional)
    # Aqui opto por actualizar la descripcion solo si es nueva o esta vacia para no borrar tus notas
    
    # Primero verificamos si existe
    cursor.execute("SELECT description FROM profiles_vlan WHERE olt_id=%s AND vlan_id=%s", (olt_id, vlan_id))
    row = cursor.fetchone()
    
    final_desc = desc
    if row and row[0] and row[0] != "":
        final_desc = row[0] # Mantenemos la descripcion de la BD si ya existe
    elif not desc:
        final_desc = f"VLAN {vlan_id}" # Nombre por defecto
        
    sql = """INSERT INTO profiles_vlan (olt_id, vlan_id, type, description, activo) 
             VALUES (%s, %s, %s, %s, 1)
             ON DUPLICATE KEY UPDATE type=%s"""
    
    cursor.execute(sql, (olt_id, vlan_id, v_type, final_desc, v_type))
    conn.commit()
    conn.close()

def process_olt(olt_data):
    print(f"--- Buscando VLANs en: {olt_data['nombre']} ---")
    
    device = {
        'device_type': 'huawei_smartax',
        '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)
        try: conn.enable()
        except: pass
        
        # Comando para ver VLANs
        output = conn.send_command("display vlan all")
        conn.disconnect()
        
        lines = output.splitlines()
        count = 0
        
        # Regex tipico Huawei:  100   smart   common   enable   ...
        # A veces traen descripcion al final
        for line in lines:
            line = line.strip()
            # Buscamos numeros al inicio
            if not line or not line[0].isdigit(): continue
            
            parts = line.split()
            if len(parts) >= 2:
                try:
                    v_id = int(parts[0])
                    v_type = parts[1] # smart, mux, standard
                    
                    # Intentar sacar descripcion si existe (a veces esta al final)
                    v_desc = "" 
                    # Huawei output varia, a veces es la columna 5 o mas.
                    # Por simplicidad, usaremos el ID como base si no hay mas info clara
                    
                    save_vlan(olt_data['id'], v_id, v_type, v_desc)
                    count += 1
                except:
                    pass

        print(f" [OK] {count} VLANs sincronizadas.")
            
    except Exception as e:
        print(f" [ERROR] {e}")

if __name__ == "__main__":
    olts = get_olts()
    for o in olts:
        process_olt(o)