#!/usr/bin/env python3

import sys
import argparse
import requests

version = "0.1"

#access rest
def build_url(suffix):
    BASE_PATH = "/api/backend/v1"
    return ("http://" + server_host + ":" + server_port + BASE_PATH + suffix)

def rest_get(suffix):
    if verbose:
        print("GET "+ build_url(suffix))
    try:
        resp = requests.get(build_url(suffix))
    except:
        print("REST GET failed")
        return
    if resp.ok:
        try:
            js = resp.json()
            print("%s: %s" % (suffix, js))
        except:
            return
    else:
        return None

def rest_post(suffix, js = None):
    if verbose:
        print("POST "+ build_url(suffix)+ str(js))
    resp = requests.post(build_url(suffix), json=js)
    if not resp.ok:
        print("post failed")

def rest_delete(suffix):
    if verbose:
        print("DELETE "+ build_url(suffix))
    resp = requests.delete(build_url(suffix))
    if not resp.ok:
        print("delete failed")

#rest calls
def slotmap_create(bank_id, bank_slot, client_id, client_slot):
    js = {
        'bank': {'bankId': int(bank_id), 'slotNr': int(bank_slot)},
        'client': {'clientId': int(client_id), 'slotNr': int(client_slot)},
        }
    return rest_post('/slotmaps', js)

def slotmap_delete(bank_id, bank_slot):
    slotmap_id = bank_id * 65536 + bank_slot
    return rest_delete("/slotmaps/%u"%slotmap_id)

def reset_global():
    return rest_post('/global-reset')

def main(argv):
    global server_port, server_host, verbose

    parser = argparse.ArgumentParser()
    parser.add_argument("-H", "--host",    help="host to connect to",                        default="127.0.0.1")
    parser.add_argument("-p", "--port",    help="port to connect to",                        default="9997")
    parser.add_argument("-v", "--verbose", help="increase output verbosity", action="count", default=0)
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-r", "--reset",          help="remove all mappings  (POST /global-reset)", action="store_true")
    group.add_argument("-c", "--show-clients",   help="show clients         (GET /clients)",nargs='?',const="all",default=None)
    group.add_argument("-b", "--show-banks",     help="show banks           (GET /banks)",nargs='?',const="all",default=None)
    group.add_argument("-s", "--show-slotmaps",  help="show slotmaps        (GET /slotmaps)",nargs='?',const="all",default=None)
    group.add_argument("-m", "--create-slotmap", help="create new slotmap   (POST /slotmaps)",nargs=4,metavar=('bank_id', 'bank_slot','client_id','client_slot'))
    group.add_argument("-d", "--delete-slotmap", help="delete slotmapping   (DELETE /slotmaps/<id>)", type=int, nargs=2, metavar=('bank_id','bank_slot'))
    group.add_argument("-a", "--show-all",       help="show all (default if no argument given)", action="store_true")

    args = parser.parse_args()
    if args.verbose:
        print("verbosity = ", args.verbose)

    server_host = args.host
    server_port = args.port
    verbose = args.verbose

    if args.reset:
        reset_global()
        return
    if args.show_clients:
        if args.show_clients == "all":
            rest_get("/clients")
        else:
            rest_get("/clients/" + str(args.show_clients))
        return
    if args.show_banks:
        if args.show_banks == "all":
            rest_get("/banks")
        else:
            rest_get("/banks/" + str(args.show_banks))
        return
    if args.show_slotmaps:
        if args.show_slotmaps == "all":
            rest_get("/slotmaps")
        else:
            rest_get("/slotmaps/" + str(args.show_slotmaps))
        return
    if args.create_slotmap:
        slotmap_create(args.create_slotmap[0],args.create_slotmap[1],args.create_slotmap[2],args.create_slotmap[3])
        return
    if args.delete_slotmap:
        slotmap_delete(args.delete_slotmap[0],args.delete_slotmap[1])
        return
    rest_get("/clients")
    rest_get("/banks")
    rest_get("/slotmaps")

if __name__ == "__main__":
    main(sys.argv)

