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

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DB_PHP_PATH = '/var/www/html/db.php'

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()
    if not db_config:
        print(json.dumps({"success": False, "error": "Fallo al leer credenciales de base de datos"}))
        sys.exit(1)

    try:
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor(dictionary=True)
        cursor.execute("SELECT id, ip_address, snmp_port, snmp_community FROM olts WHERE ip_address IS NOT NULL AND ip_address != ''")
        olts = cursor.fetchall()
    except Exception as e:
        print(json.dumps({"success": False, "error": str(e)}))
        sys.exit(1)

    agregados = 0
    actualizados = 0
    errores = 0
    debug = ""

    for olt in olts:
        olt_id = olt['id']
        ip = olt['ip_address']
        port = olt['snmp_port'] if olt['snmp_port'] else 161
        comm = olt['snmp_community']

        out_name = run_cmd(ip, port, comm, "1.3.6.1.2.1.31.1.1.1.1")
        out_alias = run_cmd(ip, port, comm, "1.3.6.1.4.1.2011.6.128.1.1.2.21.1.6")

        if not out_name:
            errores += 1
            debug += f"[OLT {olt_id}] Sin respuesta. "
            continue

        huawei_aliases = {}
        for l in out_alias:
            m = re.search(r'\.21\.1\.6\.(\d+)\s+"?(.*?)"?$', l.strip())
            if m:
                idx = int(m.group(1))
                s = (idx >> 13) & 0x3F if idx > 65535 else (idx >> 8) & 0xFF
                p = (idx >> 8) & 0x1F if idx > 65535 else idx & 0xFF
                val = m.group(2).strip()
                if val:
                    huawei_aliases[f"0_{s}_{p}"] = val

        for l in out_name:
            m = re.search(r'\.31\.1\.1\.1\.1\.(\d+)\s+"?(GPON|EPON|XG-PON|XGS-PON)[^\d]*(\d+)\/(\d+)\/(\d+)"?$', l.strip())
            if m:
                f, s, p = int(m.group(3)), int(m.group(4)), int(m.group(5))
                key = f"{f}_{s}_{p}"
                
                alias_final = huawei_aliases.get(key, f"Puerto {f}/{s}/{p}")
                
                cursor.execute("SELECT id, alias_nombre FROM naps WHERE olt_id=%s AND frame=%s AND slot=%s AND port=%s", (olt_id, f, s, p))
                row = cursor.fetchone()
                
                if not row:
                    cursor.execute("INSERT INTO naps (olt_id, frame, slot, port, alias_nombre) VALUES (%s, %s, %s, %s, %s)", (olt_id, f, s, p, alias_final))
                    agregados += 1
                else:
                    if row['alias_nombre'].startswith('Puerto ') and key in huawei_aliases:
                        cursor.execute("UPDATE naps SET alias_nombre=%s WHERE id=%s", (alias_final, row['id']))
                        actualizados += 1

        conn.commit()

    cursor.close()
    conn.close()

    if agregados > 0 or actualizados > 0:
        print(json.dumps({"success": True, "message": f"Escaneo exitoso. Agregados: {agregados}. Actualizados: {actualizados}."}))
    elif errores > 0:
        print(json.dumps({"success": False, "error": f"Errores de conexion: {debug}"}))
    else:
        print(json.dumps({"success": True, "message": "El hardware ya esta sincronizado. No hay cambios nuevos."}))

if __name__ == "__main__":
    main()
