#!/usr/bin/python

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):
		om = dbus.Interface(bus.get_object("org.neard", "/"),
					"org.freedesktop.DBus.ObjectManager")
		objects = om.GetManagedObjects()
		for path, interfaces in objects.iteritems():
			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):
		om = dbus.Interface(bus.get_object("org.neard", "/"),
					"org.freedesktop.DBus.ObjectManager")
		objects = om.GetManagedObjects()
		for path, interfaces in objects.iteritems():
			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)
