#!/usr/bin/python

from __future__ import absolute_import, print_function, unicode_literals

'''
Proximity Monitor test script
'''

import gobject

import sys
import dbus
import dbus.mainloop.glib
from optparse import OptionParser, make_option
import bluezutils

BUS_NAME = 'org.bluez'
PROXIMITY_MONITOR_INTERFACE = 'org.bluez.ProximityMonitor1'

def properties_changed(interface, changed, invalidated):
	if interface != PROXIMITY_MONITOR_INTERFACE:
		return

	for name, value in changed.iteritems():
		print("Property %s changed:  %s" % (name, str(value)))

if __name__ == "__main__":
	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

	bus = dbus.SystemBus()

	option_list = [
		make_option("-i", "--adapter", action="store",
			type="string", dest="dev_id"),
		make_option("-b", "--device", action="store",
			type="string", dest="address"),

		]
	parser = OptionParser(option_list=option_list)

	(options, args) = parser.parse_args()

	if (len(args) < 1):
		print("Usage: %s <command>" % (sys.argv[0]))
		print("")
		print("  -b MAC LinkLossAlertLevel <none|mild|high>")
		print("  -b MAC ImmediateAlertLevel <none|mild|high>")
		sys.exit(1)

	device = bluezutils.find_device(options.address, options.dev_id)
	device_path = device.object_path

	bus.add_signal_receiver(properties_changed, bus_name=BUS_NAME,
			path=device_path,
			dbus_interface="org.freedesktop.DBus.Properties",
			signal_name="PropertiesChanged")

	proximity = dbus.Interface(bus.get_object(BUS_NAME, device_path),
						PROXIMITY_MONITOR_INTERFACE)

	device_prop = dbus.Interface(bus.get_object(BUS_NAME, device_path),
					"org.freedesktop.DBus.Properties")

	print("Proximity SetProperty('%s', '%s')" % (args[0], args[1]))
	device_prop.Set(PROXIMITY_MONITOR_INTERFACE, args[0], args[1])

	mainloop = gobject.MainLoop()
	mainloop.run()
