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

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 recuperar_todo():
    conn = mysql.connector.connect(**DB_CONFIG)
    cursor = conn.cursor()
    cursor.execute("SELECT id, ip_address, snmp_community FROM olts")
    olts = cursor.fetchall()

    for olt_id, ip, comm in olts:
        print(f"\n[+] Iniciando recuperacion profunda en OLT: {ip}...")
        cursor.execute("SELECT onu_id, slot, port, estado_actual FROM onus WHERE olt_id=%s", (olt_id,))
        onus = cursor.fetchall()
        
        exitos = 0
        for onu_id, slot, port, estado in onus:
            port_index = (slot << 8) + port
            # OID .22 es Uptime, .23 es Downtime
            oid = "22" if estado == "ONLINE" else "23"
            full_oid = f"1.3.6.1.4.1.2011.6.128.1.1.2.46.1.{oid}.{port_index}.{onu_id}"
            
            # snmpget individual (-Onx fuerza la lectura hexadecimal de Huawei)
            cmd = f"snmpget -v2c -c {comm} -Onx -t 2 -r 1 {ip}:161 {full_oid}"
            try:
                out = subprocess.check_output(cmd, shell=True).decode('latin-1', errors='ignore')
                tiempo_real = parse_huawei_time(out)
                if tiempo_real:
                    cursor.execute("UPDATE onus SET fecha_estado=%s WHERE olt_id=%s AND slot=%s AND port=%s AND onu_id=%s",
                                   (tiempo_real, olt_id, slot, port, onu_id))
                    exitos += 1
            except: pass
            
            time.sleep(0.01) # Pausa microscopica para cuidar el procesador de la OLT
            if exitos > 0 and exitos % 200 == 0:
                print(f"    -> {exitos} tiempos reales recuperados...")
                conn.commit()

        conn.commit()
        print(f"[*] OLT {ip} finalizada. {exitos} clientes con historial exacto de hardware.")
    conn.close()

if __name__ == "__main__":
    recuperar_todo()