#!/usr/bin/python
# -*- coding: utf-8 -*-

import dbus
import dbus.service
import gobject
from dbus.mainloop.glib import DBusGMainLoop
import sys

DBusGMainLoop(set_as_default=True)
loop = gobject.MainLoop()

bus = dbus.SystemBus()

hdp_manager = dbus.Interface(bus.get_object("org.bluez", "/org/bluez"),
						"org.bluez.HealthManager")
app_path = hdp_manager.CreateApplication({"DataType": dbus.types.UInt16(4103),
					"Role": "sink"})

print app_path

manager = dbus.Interface(bus.get_object("org.bluez", "/"),
						"org.bluez.Manager")

adapters = manager.ListAdapters()

i = 1
for ad in adapters:
	print "%d. %s" % (i, ad)
	i = i + 1

print "Select an adapter: ",
select = None
while select == None:
	try:
		pos = int(sys.stdin.readline()) - 1
		if pos < 0:
			raise TypeError
		select = adapters[pos]
	except (TypeError, IndexError, ValueError):
		print "Wrong selection, try again: ",
	except KeyboardInterrupt:
		sys.exit()

adapter =  dbus.Interface(bus.get_object("org.bluez", select),
						"org.bluez.Adapter")

devices = adapter.ListDevices()

if len(devices) == 0:
	print "No devices available"
	sys.exit()

i = 1
for dev in devices:
	print "%d. %s" % (i, dev)
	i = i + 1

print "Select a device: ",
select = None
while select == None:
	try:
		pos = int(sys.stdin.readline()) - 1
		if pos < 0:
			raise TypeError
		select = devices[pos]
	except (TypeError, IndexError, ValueError):
		print "Wrong selection, try again: ",
	except KeyboardInterrupt:
		sys.exit()

print "Connecting to %s" % (select)
device = dbus.Interface(bus.get_object("org.bluez", select),
					"org.bluez.HealthDevice")

chan = device.CreateChannel(app_path, "Any")

print chan

print "Push Enter for finishing"
sys.stdin.readline()

hdp_manager.DestroyApplication(app_path)
