#!/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()
for path, interfaces in objects.iteritems():
	if "org.bluez.Adapter" not in interfaces.keys():
		continue

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

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

	try:
		device_list = properties["Devices"]
	except:
		device_list = []

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

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

		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("")
