#!/usr/bin/python3

import sys
import dbus
import neardutils

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("  dump <device>")
    print("  push <device> <type> <...>")
    print("	   If type is Text, parameters are <encoding> <language> <representation>")
    print("	   If type is URI, parameters are <uri>")
    print("	   If type is SmartPoster, parameters are <uri>")
    print("	   If type is Handover, parameters are <carrier>")
    print("	   If type is StaticHandover, parameters are <carrier>")
    print("    If type is MIME, parameters are <mime_type> (only wifi_wsc and raw)")
    print("       raw is for sending raw payload, parameters are <mime_type> <payload>")
    print(
        "e.g. < %s push /org/neard/nfc0/device0 Text UTF-8 en-US hello,Type2! >" %
        (sys.argv[0]))
    print(
        "e.g. < %s push /org/neard/nfc0/device0 URI http://www.nfc-forum.com >" %
        (sys.argv[0]))
    print(
        "e.g. < %s push /org/neard/nfc0/device0 SmartPoster http://www.nfc-forum.com >" %
        (sys.argv[0]))
    print(
        "e.g. < %s push /org/neard/nfc0/device0 Handover bluetooth,wifi >" %
        (sys.argv[0]))
    print(
        "e.g. < %s push /org/neard/nfc0/device0 StaticHandover bluetooth,wifi >" %
        (sys.argv[0]))
    print(
        "e.g. < %s push /org/neard/nfc0/device0 MIME wifi_wsc>" %
        (sys.argv[0]))
    print(
        "e.g. < %s push /org/neard/nfc0/device0 MIME raw application/xml '<your><xml tags></your>' >" %
        (sys.argv[0]))

    sys.exit(1)


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

if (sys.argv[1] == "list"):
    if (len(sys.argv) < 3):
        objects = neardutils.get_managed_objects()
        for path, interfaces in objects.items():
            if "org.neard.Device" not in interfaces:
                continue

            print(" [ %s ]" % (path))

            props = interfaces["org.neard.Device"]

            for (key, value) in props.items():
                print("    %s = %s" % (key, value))

        sys.exit(0)

if (sys.argv[1] == "dump"):
    if (len(sys.argv) < 3):
        objects = neardutils.get_managed_objects()
        for path, interfaces in objects.items():
            if "org.neard.Device" not in interfaces:
                continue

            print("[ %s ]" % (path))
            neardutils.dump_all_records(path)

        sys.exit(0)
    else:
        neardutils.dump_all_records(sys.argv[2])

        sys.exit(0)

if (sys.argv[1] == "push"):
    if (len(sys.argv) < 5):
        usage()

    device = neardutils.find_device(sys.argv[2])

    if len(sys.argv) == 7:
        if sys.argv[3] in ["Text"]:
            device.Push(({"Type": "Text",
                          "Encoding": sys.argv[4],
                          "Language": sys.argv[5],
                          "Representation": sys.argv[6]}))
        elif sys.argv[3] in ["MIME"]:
            if sys.argv[4] in ["raw"]:
                device.Push(({"Type": "MIME",
                              "MIME": sys.argv[5],
                              "Payload": dbus.ByteArray(sys.argv[6])}))
        else:
            usage()

    elif len(sys.argv) == 5:
        if sys.argv[3] in ["URI"]:
            device.Push(({"Type": "URI",
                          "URI": sys.argv[4]}))
        elif sys.argv[3] in ["SmartPoster"]:
            device.Push(({"Type": "SmartPoster",
                          "URI": sys.argv[4]}))
        elif sys.argv[3] in ["Handover"]:
            device.Push(({"Type": "Handover",
                          "Carrier": sys.argv[4]}))
        elif sys.argv[3] in ["StaticHandover"]:
            device.Push(({"Type": "StaticHandover",
                          "Carrier": sys.argv[4]}))
        elif sys.argv[3] in ["MIME"]:
            if sys.argv[4] in ["wifi_wsc"]:
                device.Push(({"Type": "MIME",
                              "MIME": "application/vnd.wfa.wsc"}))
        else:
            usage()
    else:
        usage()

    sys.exit(0)
