#!/usr/bin/python3

import sys
import dbus

bus = dbus.SystemBus()


def extract_list(list):
    val = "["
    for i in list:
        val += " " + str(i)
    val += " ]"
    return val


def usage():
    print("Usage: %s <command>" % (sys.argv[0]))
    print("")
    print("  list")
    print("  enabled se/nfcX_<se_type>_seX [on/off]")
    print("  open_channel se/nfcX_<se_type>_seX <AID>")
    print("  close_channel se/nfcX_<se_type>_seX channelX")
    sys.exit(1)


if (len(sys.argv) < 2):
    usage()

if (sys.argv[1] == "list"):
    if (len(sys.argv) != 2):
        usage()
    else:
        manager = dbus.Interface(bus.get_object("org.neard.se", "/"),
                                 "org.neard.se.Manager")
        properties = manager.GetProperties()

        for path in properties["SecureElements"]:
            print("[ %s ]" % path)

            seel = dbus.Interface(bus.get_object("org.neard.se", path),
                                  "org.neard.se.SecureElement")
            properties = seel.GetProperties()

            for key in properties.keys():
                if key in ["Enabled"]:
                    if properties[key] == dbus.Boolean(1):
                        val = "true"
                    else:
                        val = "false"
                    print("    %s = %s" % (key, val))

                if key in ["Type"]:
                    print("    %s = %s" % (key, str(properties[key])))

                if key in ["Channels"]:
                    print("    %s = %s" % (key, extract_list(properties[key])))
    sys.exit(0)

if (sys.argv[1] == "enabled"):
    if (len(sys.argv) < 4):
        usage()
    else:
        path = "/org/neard/se/" + sys.argv[2]

        seel = dbus.Interface(bus.get_object("org.neard.se", path),
                              "org.neard.se.SecureElement")

        try:
            if (sys.argv[3] == "on"):
                val = seel.SetProperty("Enabled", dbus.Boolean(1), timeout=10)
            elif (sys.argv[3] == "off"):
                val = seel.SetProperty("Enabled", dbus.Boolean(0), timeout=10)
            else:
                print("Invalid option %s" % sys.argv[3])

        except dbus.DBusException as error:
            print("%s: %s" % (error._dbus_error_name, error.message))
    sys.exit(0)

if (sys.argv[1] == "open_channel"):
    if (len(sys.argv) < 4):
        usage()
    else:
        path = "/org/neard/se/" + sys.argv[2]

        seel = dbus.Interface(bus.get_object("org.neard.se", path),
                              "org.neard.se.SecureElement")

        try:
            channel = seel.OpenChannel(sys.argv[3].decode("hex"))

            print("Opened channel: %s" % str(channel))
        except dbus.DBusException as error:
            print("%s: %s" % (error._dbus_error_name, error.message))
    sys.exit(0)

if (sys.argv[1] == "close_channel"):
    if (len(sys.argv) < 4):
        usage()
    else:
        seel_path = "/org/neard/se/" + sys.argv[2]
        channel_path = seel_path + "/" + sys.argv[3]

        seel = dbus.Interface(bus.get_object("org.neard.se", seel_path),
                              "org.neard.se.SecureElement")

        channel = dbus.Interface(bus.get_object("org.neard.se", channel_path),
                                 "org.neard.se.Channel")
        try:
            seel.CloseChannel(channel)

        except dbus.DBusException as error:
            print("%s: %s" % (error._dbus_error_name, error.message))
    sys.exit(0)

usage()
