#!/usr/bin/python

import sys
import dbus
import time
from optparse import OptionParser, make_option

bus = dbus.SystemBus()

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

option_list = [
		make_option("-i", "--device", action="store",
				type="string", dest="dev_id"),
		]
parser = OptionParser(option_list=option_list)

(options, args) = parser.parse_args()

if options.dev_id:
	adapter_path = manager.FindAdapter(options.dev_id)
else:
	adapter_path = manager.DefaultAdapter()

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

if (len(args) < 1):
	print "Usage: %s <command>" % (sys.argv[0])
	print ""
	print "  address"
	print "  name [name]"
	print "  powered [on/off]"
	print "  pairable [on/off]"
	print "  pairabletimeout [timeout]"
	print "  discoverable [on/off]"
	print "  discoverabletimeout [timeout]"
	print "  discovering"
	sys.exit(1)

if (args[0] == "address"):
	properties = adapter.GetProperties()
	print properties["Address"]
	sys.exit(0)

if (args[0] == "name"):
	if (len(args) < 2):
		properties = adapter.GetProperties()
		print properties["Name"]
	else:
		adapter.SetProperty("Name", args[1])
	sys.exit(0)

if (args[0] == "powered"):
	if (len(args) < 2):
		properties = adapter.GetProperties()
		print properties["Powered"]
	else:
		if (args[1] == "on"):
			value = dbus.Boolean(1)
		elif (args[1] == "off"):
			value = dbus.Boolean(0)
		else:
			value = dbus.Boolean(args[1])
		adapter.SetProperty("Powered", value)
	sys.exit(0)

if (args[0] == "pairable"):
	if (len(args) < 2):
		properties = adapter.GetProperties()
		print properties["Pairable"]
	else:
		if (args[1] == "on"):
			value = dbus.Boolean(1)
		elif (args[1] == "off"):
			value = dbus.Boolean(0)
		else:
			value = dbus.Boolean(args[1])
		adapter.SetProperty("Pairable", value)
	sys.exit(0)

if (args[0] == "pairabletimeout"):
	if (len(args) < 2):
		properties = adapter.GetProperties()
		print properties["PairableTimeout"]
	else:
		timeout = dbus.UInt32(args[1])
		adapter.SetProperty("PairableTimeout", timeout)
	sys.exit(0)

if (args[0] == "discoverable"):
	if (len(args) < 2):
		properties = adapter.GetProperties()
		print properties["Discoverable"]
	else:
		if (args[1] == "on"):
			value = dbus.Boolean(1)
		elif (args[1] == "off"):
			value = dbus.Boolean(0)
		else:
			value = dbus.Boolean(args[1])
		adapter.SetProperty("Discoverable", value)
	sys.exit(0)

if (args[0] == "discoverabletimeout"):
	if (len(args) < 2):
		properties = adapter.GetProperties()
		print properties["DiscoverableTimeout"]
	else:
		timeout = dbus.UInt32(args[1])
		adapter.SetProperty("DiscoverableTimeout", timeout)
	sys.exit(0)

if (args[0] == "discovering"):
	properties = adapter.GetProperties()
	print properties["Discovering"]
	sys.exit(0)

print "Unknown command"
sys.exit(1)
