# -*- coding: utf-8 -*-
import subprocess, re, mysql.connector, sys

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_snmp_walk(ip, port, community, oid):
    target = "{}:{}".format(ip.strip(), str(port).strip())
    cmd = "snmpbulkwalk -v2c -c {} -t 5 -r 2 -Cr20 -On {} {}".format(community.strip(), target, oid)
    try:
        return subprocess.check_output(cmd, shell=True).decode('latin-1', errors='ignore').splitlines()
    except: return []

def descubrir(olt_id, ip, port, comm):
    print("--- Descubriendo ONUs en OLT ID: {} ---".format(olt_id))
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor()

    # 1. Obtener Nombres/Alias de las ONUs
    # OID para nombres: .1.3.6.1.4.1.2011.6.128.1.1.2.43.1.9
    nombres = {}
    lines = get_snmp_walk(ip, port, comm, "1.3.6.1.4.1.2011.6.128.1.1.2.43.1.9")
    for l in lines:
        m = re.search(r'\.43\.1\.9\.(\d+)\.(\d+)\s*=\s*STRING:\s*"(.*)"', l)
        if m: nombres[(int(m.group(1)), int(m.group(2)))] = m.group(3)

    # 2. Obtener Serials
    # OID para serials: .1.3.6.1.4.1.2011.6.128.1.1.2.43.1.3
    serials = {}
    lines = get_snmp_walk(ip, port, comm, "1.3.6.1.4.1.2011.6.128.1.1.2.43.1.3")
    for l in lines:
        if "Hex-STRING" in l or "STRING" in l:
            m = re.search(r'\.43\.1\.3\.(\d+)\.(\d+)', l)
            if m:
                val = l.split(":")[-1].replace('"', '').replace(" ", "").strip()
                serials[(int(m.group(1)), int(m.group(2)))] = val

    # 3. Insertar en Base de Datos (Ignorar si ya existen)
    batch = []
    for k, sn in serials.items():
        idx, onu_id = k
        frame, slot, port_num = 0, (idx >> 8) & 0xFF, idx & 0xFF
        nombre = nombres.get(k, "ONU_NUEVA")
        batch.append((olt_id, frame, slot, port_num, onu_id, sn, nombre))

    if batch:
        sql = "INSERT IGNORE INTO onus (olt_id, frame, slot, port, onu_id, serial_number, nombre_cliente, estado_actual) VALUES (%s, %s, %s, %s, %s, %s, %s, 'OFFLINE')"
        cursor.executemany(sql, batch)
        conn.commit()
        print("Done! {} ONUs encontradas e importadas.".format(len(batch)))
    
    conn.close()

# Ejecutar para todas las OLTs
db = mysql.connector.connect(**DB_CONFIG)
cur = db.cursor()
cur.execute("SELECT id, ip_address, snmp_port, snmp_community FROM olts")
for o in cur.fetchall(): descubrir(o[0], o[1], o[2], o[3])
db.close()