#!/usr/bin/env python

import argparse

from pyunifi.controller import Controller

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--controller', default='unifi', help='the controller address (default "unifi")')
parser.add_argument('-u', '--username', default='admin', help='the controller username (default("admin")')
parser.add_argument('-p', '--password', default='', help='the controller password')
parser.add_argument('-b', '--port', default='8443', help='the controller port (default "8443")')
parser.add_argument('-v', '--version', default='v5', help='the controller base version (default "v5")')
parser.add_argument('-s', '--siteid', default='default', help='the site ID, UniFi >=3.x only (default "default")')
parser.add_argument('-V', '--no-ssl-verify', default=False, action='store_true', help='Don\'t verify ssl certificates')
parser.add_argument('-C', '--certificate', default='', help='verify with ssl certificate pem file')
args = parser.parse_args()

ssl_verify = (not args.no_ssl_verify)

if ssl_verify and len(args.certificate) > 0:
        ssl_verify = args.certificate

c = Controller(args.controller, args.username, args.password, args.port, args.version, args.siteid, ssl_verify=ssl_verify)

aps = c.get_aps()
ap_names = dict([(ap['mac'], ap.get('name', '????')) for ap in aps])
clients = c.get_clients()
clients.sort(key=lambda x: -x.get('rssi', 100))

FORMAT = '%-16s  %18s  %-12s  %4s  %4s  %3s  %3s'
print(FORMAT % ('NAME', 'MAC', 'AP', 'CHAN', 'RSSI', 'RX', 'TX'))
for client in clients:
    ap_name = ap_names.get(client.get('ap_mac', '????'), '????')
    name = client.get('hostname') or client.get('ip', '????')
    rssi = client.get('rssi', '????')
    mac = client.get('mac', '????')
    rx = int(client.get('rx_rate', 0) / 1000)
    tx = int(client.get('tx_rate', 0) / 1000)
    channel = client.get('channel','????')

    print(FORMAT % (name, mac, ap_name, channel, rssi, rx, tx))
