import re
import json
import sys
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException

def get_aruba_clients(host, username, password):
    """
    Connects to an Aruba switch via SSH, gets hostname and client info,
    and returns a list of dictionaries, each representing a client.
    """
    device = {
        'device_type': 'aruba_aoscx',
        'host': host,
        'username': username,
        'password': password,
    }

    all_clients_data = []
    print(f"Csatlakozás a(z) {host} eszközhöz...", file=sys.stderr)
    try:
        with ConnectHandler(**device) as net_connect:
            print("Sikeres csatlakozás. Adatok lekérdezése...", file=sys.stderr)
            
            prompt = net_connect.find_prompt()
            switch_hostname = prompt.strip('#> ')

            output = net_connect.send_command('show client ip')
            ip_pattern = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')

            if isinstance(output, str):
                lines = output.splitlines()
                for line in lines[2:]:
                    columns = line.split()
                    if len(columns) >= 4:
                        potential_ip = columns[-1]
                        if ip_pattern.match(potential_ip):
                            client_data = {
                                'switch_name': switch_hostname,
                                'mac_address': columns[0],
                                'interface': columns[1],
                                'vlan': columns[2],
                                'ip_address': potential_ip,
                            }
                            all_clients_data.append(client_data)
                return all_clients_data
            
            print("Hiba: A parancs kimenete nem volt a várt formátumban.", file=sys.stderr)
            return None

    except NetmikoTimeoutException:
        print(f"Hiba: Időtúllépés a(z) {host} eszközhöz való csatlakozáskor.", file=sys.stderr)
        return None
    except NetmikoAuthenticationException:
        print(f"Hiba: Sikertelen hitelesítés a(z) {host} eszközön. Ellenőrizd a jelszót.", file=sys.stderr)
        return None
    except Exception as e:
        print(f"Váratlan hiba történt: {e}", file=sys.stderr)
        return None

if __name__ == "__main__":
    # Konfigurációs fájl beolvasása
    try:
        with open('config.json', 'r') as f:
            config = json.load(f)
    except FileNotFoundError:
        print("Hiba: A 'config.json' fájl nem található.", file=sys.stderr)
        exit(1)
    except json.JSONDecodeError:
        print("Hiba: A 'config.json' fájl formátuma érvénytelen.", file=sys.stderr)
        exit(1)

    SWITCH_IPS = config.get("switch_ips", [])
    USERNAME = config.get("username")
    PASSWORD = config.get("password")

    if not all([SWITCH_IPS, USERNAME, PASSWORD]):
        print("Hiba: A 'config.json' fájl hiányos. Tartalmaznia kell 'switch_ips', 'username', és 'password' kulcsokat.", file=sys.stderr)
        exit(1)
    
    all_switches_clients = []
    for ip in SWITCH_IPS:
        print(f"\n--- Feldolgozás: {ip} ---", file=sys.stderr)
        clients_from_one_switch = get_aruba_clients(ip, USERNAME, PASSWORD)
        if clients_from_one_switch:
            all_switches_clients.extend(clients_from_one_switch)
            print(f"Sikeresen lekérdezve {len(clients_from_one_switch)} kliens a(z) {ip} switch-ről.", file=sys.stderr)
        else:
            print(f"Nem sikerült adatot lekérdezni a(z) {ip} switch-ről.", file=sys.stderr)

    # Ha nem sikerült adatot gyűjteni, jelezzük a stderr-en
    if not all_switches_clients:
        print("\nEgyetlen switch-ről sem sikerült adatot gyűjteni.", file=sys.stderr)

    # --- Fő kimenet: JSON a stdout-ra ---
    print(json.dumps(all_switches_clients, indent=2))

