#!/usr/bin/python

from __future__ import absolute_import, print_function, unicode_literals

import dbus

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object("org.bluez", "/"),
					"org.freedesktop.DBus.ObjectManager")

def extract_objects(object_list):
	list = ""
	for object in object_list:
		val = str(object)
		list = list + val[val.rfind("/") + 1:] + " "
	return list

def extract_uuids(uuid_list):
	list = ""
	for uuid in uuid_list:
		if (uuid.endswith("-0000-1000-8000-00805f9b34fb")):
			if (uuid.startswith("0000")):
				val = "0x" + uuid[4:8]
			else:
				val = "0x" + uuid[0:8]
		else:
			val = str(uuid)
		list = list + val + " "
	return list

objects = manager.GetManagedObjects()

all_devices = (str(path) for path, interfaces in objects.iteritems() if
					"org.bluez.Device1" in interfaces.keys())

for path, interfaces in objects.iteritems():
	if "org.bluez.Adapter1" not in interfaces.keys():
		continue

	print("[ " + path + " ]")

	properties = interfaces["org.bluez.Adapter1"]
	for key in properties.keys():
		value = properties[key]
		if (key == "UUIDs"):
			list = extract_uuids(value)
			print("    %s = %s" % (key, list))
		else:
			print("    %s = %s" % (key, value))

	device_list = [d for d in all_devices if d.startswith(path + "/")]

	for dev_path in device_list:
		print("    [ " + dev_path + " ]")

		dev = objects[dev_path]
		properties = dev["org.bluez.Device1"]

		for key in properties.keys():
			value = properties[key]
			if (key == "UUIDs"):
				list = extract_uuids(value)
				print("        %s = %s" % (key, list))
			elif (key == "Class"):
				print("        %s = 0x%06x" % (key, value))
			elif (key == "Vendor"):
				print("        %s = 0x%04x" % (key, value))
			elif (key == "Product"):
				print("        %s = 0x%04x" % (key, value))
			elif (key == "Version"):
				print("        %s = 0x%04x" % (key, value))
			else:
				print("        %s = %s" % (key, value))

	print("")
