import subprocess, re, mysql.connector

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 parse_huawei_time(raw_val):
    import re
    if not raw_val or "No Such" in raw_val: return None
    val_str = raw_val.split("=", 1)[-1].strip() if "=" in raw_val else raw_val.strip()
    
    # 1. Intento de lectura estandar
    m_str = re.search(r'(\d{4})[-/](\d{1,2})[-/](\d{1,2})[ ,T]+(\d{1,2}):(\d{1,2}):(\d{1,2})', val_str)
    if m_str: 
        return f"{m_str.group(1)}-{int(m_str.group(2)):02d}-{int(m_str.group(3)):02d} {int(m_str.group(4)):02d}:{int(m_str.group(5)):02d}:{int(m_str.group(6)):02d}"
    
    # 2. Intento de lectura Hex-STRING (Logica implementada del usuario)
    val_clean = val_str.replace("Hex-STRING:", "").replace("STRING:", "").replace('"', '').strip()
    hex_parts = val_clean.split()
    if len(hex_parts) >= 7:
        try:
            y = int(hex_parts[0]+hex_parts[1], 16)
            m = int(hex_parts[2], 16)
            d = int(hex_parts[3], 16)
            h = int(hex_parts[4], 16)
            min_ = int(hex_parts[5], 16)
            s = int(hex_parts[6], 16)
            return f"{y}-{m:02d}-{d:02d} {h:02d}:{min_:02d}:{s:02d}"
        except: pass
    return None

def main():
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor()
    cursor.execute("SELECT id, ip_address, snmp_community FROM olts LIMIT 1")
    olt = cursor.fetchone()
    if not olt: return
    olt_id, ip, comm = olt

    print(f"Iniciando recuperacin profunda en {ip} (Esto tomar unos minutos sin saturar la OLT)...")
    
    cursor.execute("SELECT onu_id, slot, port, estado_actual FROM onus WHERE olt_id=%s", (olt_id,))
    onus = cursor.fetchall()
    
    actualizados = 0
    for onu_id, slot, port, estado in onus:
        port_index = (slot << 8) + port
        
        if estado == 'ONLINE':
            oid = f"1.3.6.1.4.1.2011.6.128.1.1.2.46.1.22.{port_index}.{onu_id}"
        else:
            oid = f"1.3.6.1.4.1.2011.6.128.1.1.2.46.1.23.{port_index}.{onu_id}"
            
        # snmpget individual, muy ligero para el procesador
        cmd = f"snmpget -v2c -c {comm} -Onx -t 2 -r 1 {ip}:161 {oid}"
        try:
            out = subprocess.check_output(cmd, shell=True).decode('latin-1', errors='ignore')
            olt_time = parse_huawei_time(out)
            if olt_time:
                cursor.execute("UPDATE onus SET fecha_estado=%s WHERE olt_id=%s AND slot=%s AND port=%s AND onu_id=%s",
                               (olt_time, olt_id, slot, port, onu_id))
                actualizados += 1
        except:
            pass
            
        if actualizados % 100 == 0 and actualizados > 0:
            print(f"Progreso: {actualizados} tiempos histricos recuperados...")
            conn.commit()

    conn.commit()
    conn.close()
    print(f"Listo! Se recuper el historial exacto de {actualizados} clientes.")

if __name__ == "__main__":
    main()