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

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()

def get_snmp_walk(ip, port, community, oid):
    cmd = f"snmpbulkwalk -v2c -c {community} -t 5 -r 2 -Cr10 -On {ip}:{port} {oid}"
    try: return subprocess.check_output(cmd, shell=True).decode('latin-1', errors='ignore').splitlines()
    except: return []

# ==========================================
# CAMBIO CLAVE: Usamos la rama MAC (.53) en lugar de Ethernet (.52)
# Esto extrae el trafico global de la ONT directo del puerto GPON
# ==========================================
OID_UPSTREAM = "1.3.6.1.4.1.2011.6.128.1.1.2.53.1.4"   # Rx (Subida)
OID_DOWNSTREAM = "1.3.6.1.4.1.2011.6.128.1.1.2.53.1.5" # Tx (Bajada)

def procesar_trafico_olt(olt_data):
    olt_id, olt_name, olt_ip, olt_port, olt_comm = olt_data
    print(f"\n--- Consultando OLT: {olt_name} ({olt_ip}) ---")
    
    rx_lines = get_snmp_walk(olt_ip, olt_port, olt_comm, OID_UPSTREAM)
    tx_lines = get_snmp_walk(olt_ip, olt_port, olt_comm, OID_DOWNSTREAM)
    
    print(f"> Lineas RX (Subida) obtenidas: {len(rx_lines)}")
    print(f"> Lineas TX (Bajada) obtenidas: {len(tx_lines)}")

    # Imprimir muestra para diagnostico visual
    if len(rx_lines) > 0: print(f"  Muestra RX: {rx_lines[0].strip()}")

    rx_data = {}
    tx_data = {}
    
    # Filtro adaptado para la rama .53
    for line in rx_lines:
        m = re.search(r'\.53\.1\.4\.(\d+)\.(\d+).*?(?:Counter64|INTEGER):\s*(\d+)$', line.strip())
        if m: 
            idx, onuid = int(m.group(1)), int(m.group(2))
            s = (idx >> 13) & 0x3F if idx > 65535 else (idx >> 8) & 0xFF
            pt = (idx >> 8) & 0x1F if idx > 65535 else idx & 0xFF
            rx_data[(s, pt, onuid)] = int(m.group(3))

    for line in tx_lines:
        m = re.search(r'\.53\.1\.5\.(\d+)\.(\d+).*?(?:Counter64|INTEGER):\s*(\d+)$', line.strip())
        if m: 
            idx, onuid = int(m.group(1)), int(m.group(2))
            s = (idx >> 13) & 0x3F if idx > 65535 else (idx >> 8) & 0xFF
            pt = (idx >> 8) & 0x1F if idx > 65535 else idx & 0xFF
            tx_data[(s, pt, onuid)] = int(m.group(3))

    print(f"> ONUs mapeadas correctamente (RX: {len(rx_data)}, TX: {len(tx_data)})")

    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor()

    try:
        cursor.execute("SELECT id, onu_id, slot, port FROM onus WHERE olt_id = %s", (olt_id,))
        db_onus = cursor.fetchall()
        
        l_inserts = []
        
        for onu in db_onus:
            db_id, onu_id, slot, port = onu
            key = (int(slot), int(port), int(onu_id))
            
            rx_bytes = rx_data.get(key, 0)
            tx_bytes = tx_data.get(key, 0)
            
            # Solo guardamos si el contador es valido y mayor a 0
            if rx_bytes > 0 or tx_bytes > 0:
                l_inserts.append((db_id, rx_bytes, tx_bytes))
                
        print(f"> ONUs a guardar en BD: {len(l_inserts)}")
                
        if l_inserts:
            cursor.executemany("INSERT INTO onu_traffic_history (onu_db_id, rx_bytes, tx_bytes, timestamp) VALUES (%s, %s, %s, NOW())", l_inserts)
            cursor.execute("DELETE FROM onu_traffic_history WHERE timestamp < NOW() - INTERVAL 8 DAY")
            
        conn.commit()
        print("> OK.")
    except Exception as e:
        conn.rollback()
        print(f"X Error BD: {e}")
    finally:
        cursor.close()
        conn.close()

if __name__ == "__main__":
    try:
        db = mysql.connector.connect(**DB_CONFIG)
        cur = db.cursor()
        cur.execute("SELECT id, nombre, ip_address, snmp_port, snmp_community FROM olts")
        olts = cur.fetchall()
        db.close()
        
        for olt in olts:
            procesar_trafico_olt(olt)
    except Exception as e:
        print(f"ERROR: {e}")
