import os
import re
import csv
from datetime import datetime

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...")
    try:
        with ConnectHandler(**device) as net_connect:
            print("Sikeres csatlakozás. Adatok lekérdezése...")
            
            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.")
            return None

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

if __name__ == "__main__":

    # --- IDE DEFINIÁLD A SWITCH-EK IP CÍMEIT ---

    SWITCH_IPS = [

        "10.220.1.84", # NET-SW01
        "10.220.1.85", # NET-SW02
        "10.220.1.86", # NET-SW04
        "10.220.1.87", # NET-SW05
        "10.220.1.88", # NET-SW06
        "10.220.1.89", # NET-SW01 - Core
        "10.220.1.90", # NET-SW07
        "10.220.1.91", # NET-SW08
        "10.220.1.92", # NET-SW09
        "10.220.1.93", # NET-SW10
        "10.220.1.94", # NET-SW11
        "10.220.1.96", # NET-SW13
        "10.220.1.98", # NET-SW16 - HA
        "10.220.1.99", # NET-SW17

    ]

    USERNAME = os.getenv('ARUBA_USER', 'svc.operator')  # Felhasználónév környezeti változóból, alapértelmezett értékkel
    if not USERNAME:
        print("Hiba: Az ARUBA_USER környezeti változó nincs beállítva.")
        exit()

    

    # A kimeneti mappa a konténeren belül

    OUTPUT_DIR = "/data"

    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")

    CSV_FILENAME = os.path.join(OUTPUT_DIR, f"aruba_clients_ALL_{timestamp}.csv")

    

    
    PASSWORD = os.getenv('ARUBA_PASSWORD')
    if not PASSWORD:
        print("Hiba: Az ARUBA_PASSWORD környezeti változó nincs beállítva.")
        exit()



    all_switches_clients = []



    for ip in SWITCH_IPS:

        print(f"\n--- Feldolgozás: {ip} ---")

        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.")

        else:

            print(f"Nem sikerült adatot lekérdezni a(z) {ip} switch-ről.")

    

    if all_switches_clients:

        print(f"\nÖsszesen {len(all_switches_clients)} kliens adat gyűjtve. Mentés a(z) {CSV_FILENAME} fájlba...")

        

        fieldnames = all_switches_clients[0].keys()

        

        try:

            # Biztosítjuk, hogy a kimeneti mappa létezzen

            os.makedirs(OUTPUT_DIR, exist_ok=True)

            with open(CSV_FILENAME, 'w', newline='', encoding='utf-8') as csvfile:

                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

                writer.writeheader()

                writer.writerows(all_switches_clients)

            print(f"Sikeres mentés a(z) '{CSV_FILENAME}' fájlba.")

        except IOError as e:

            print(f"Hiba történt a CSV fájl írása közben: {e}")



    else:

        print("\nEgyetlen switch-ről sem sikerült adatot gyűjteni.")
