#! /usr/bin/python3

import argparse
import pprint
import prettytable

from concord232 import client


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('command')
    parser.add_argument('--zone', default=None, type=int,
                        help='Zone number for zone-related commands')
    parser.add_argument('--partition', default=None, type=int,
                        help='Partition number for partition-related commands')
    parser.add_argument('--user', default=None, type=int,
                        help='User number for user-related commands')
    parser.add_argument('--master', default=None,
                        help='Master PIN for commands that require it')
    parser.add_argument('--host', default='localhost:5007',
                        help='Host and port (localhost:5007)')
    parser.add_argument('--keys', default='',
                        help='Key Presses to Send')    
    parser.add_argument('--group', default='False',
                        help='Group the Key Input as One Command ')    

    args = parser.parse_args()
    return args


def do_list(clnt, args):
    for zone in clnt.list_zones():
        pprint.pprint(zone)


def do_list_partitions(clnt, args):
    for part in clnt.list_partitions():
        pprint.pprint(part)


def do_arm(clnt, level, option = None):
    clnt.arm(level, option)

def do_disarm(clnt, args):
    if not args.master:
        print('Master pin required')
        return
    clnt.disarm(args.master)

def do_keys(clnt, args):
    if args.group:
        group = True 

    if not args.keys:
        print('Keys required')
        return
    clnt.send_keys(args.keys, group)


def do_summary(clnt, args):
    t = prettytable.PrettyTable(['Zone', 'Name', 'Bypass', 'Status','Type'])
    for zone in sorted(clnt.list_zones(), key=lambda k: k['number']) :
        t.add_row(['%i' % zone['number'], zone['name'],
                   zone['state'] ,
                   '%s' % (zone['state'] or False),
                   zone['type']])
    print(t)

    t = prettytable.PrettyTable(['Partition', 'Zones', 'Status','Level'])
    for i, part in enumerate(clnt.list_partitions()):
        if part['zones'] > 0:
            status = "Disarmed" if part['arming_level'] == "Off" else "Armed"
            t.add_row(['%i' % part['number'], part['zones'],status,part['arming_level']])
        
    print(t)


def do_show(clnt, args):
    if args.zone:
        for zone in clnt.list_zones():
            if zone['number'] == args.zone:
                pprint.pprint(zone)
                return
        print('No such zone `%s\'' % args.zone)
    elif args.partition:
        for part in clnt.list_partitions():
            if part['number'] == args.partition:
                pprint.pprint(part)
                return
        print('No such partition `%s\'' % args.partition)
    else:
        print('Zone or Partition required')


def do_events(clnt, args):
    while True:
        events = clnt.get_events()
        if events:
            for event in events:
                print(event)


def do_version(clnt, args):
    print(clnt.get_version())


def main():
    args = parse_args()
    url = 'http://%s:%s' % tuple(args.host.split(':', 1))
    clnt = client.Client(url)
    if args.command == 'list':
        do_list(clnt, args)
    elif args.command[0:3] == 'arm':
        if args.command.count('-') == 2:
            cmd, level, option = args.command.split('-')
            do_arm(clnt, level, option)
        else:
            cmd, level = args.command.split('-')
            do_arm(clnt, level)
    elif args.command == 'disarm':
        do_disarm(clnt, args)
    elif args.command == 'keys':
        do_keys(clnt, args)        
    elif args.command == 'partitions':
        do_list_partitions(clnt, args)
    elif args.command == 'summary':
        do_summary(clnt, args)
    elif args.command == 'show':
        do_show(clnt, args)
    elif args.command == 'version':
        do_version(clnt, args)

if __name__ == '__main__':
    main()
