#!/usr/bin/python

from __future__ import print_function

import os
import sys
import dbus
import dbus.service
import dbus.mainloop.glib
try:
  from gi.repository import GObject
except ImportError:
  import gobject as GObject
import bluezutils

class Player(dbus.service.Object):
	properties = None
	metadata = None

	def set_object(self, obj = None):
		if obj != None:
			bus = dbus.SystemBus()
			mp = dbus.Interface(bus.get_object("org.bluez", obj),
						"org.bluez.MediaPlayer1")
			prop = dbus.Interface(bus.get_object("org.bluez", obj),
						"org.freedesktop.DBus.Properties")

			self.properties = prop.GetAll("org.bluez.MediaPlayer1")

			bus.add_signal_receiver(self.properties_changed,
				path = obj,
				dbus_interface = "org.freedesktop.DBus.Properties",
				signal_name = "PropertiesChanged")
		else:
			track = dbus.Dictionary({
					"xesam:title" : "Title",
					"xesam:artist" : ["Artist"],
					"xesam:album" : "Album",
					"xesam:genre" : ["Genre"],
					"xesam:trackNumber" : dbus.Int32(1),
					"mpris:length" : dbus.Int64(10000) },
					signature="sv")

			self.properties = dbus.Dictionary({
					"PlaybackStatus" : "playing",
					"Identity" : "SimplePlayer",
					"LoopStatus" : "None",
					"Rate" : dbus.Double(1.0),
					"Shuffle" : dbus.Boolean(False),
					"Metadata" : track,
					"Volume" : dbus.Double(1.0),
					"Position" : dbus.Int64(0),
					"MinimumRate" : dbus.Double(1.0),
					"MaximumRate" : dbus.Double(1.0),
					"CanGoNext" : dbus.Boolean(False),
					"CanGoPrevious" : dbus.Boolean(False),
					"CanPlay" : dbus.Boolean(False),
					"CanSeek" : dbus.Boolean(False),
					"CanControl" : dbus.Boolean(False),
					},
					signature="sv")

			handler = InputHandler(self)
			GObject.io_add_watch(sys.stdin, GObject.IO_IN,
							handler.handle)

	@dbus.service.method("org.freedesktop.DBus.Properties",
					in_signature="ssv", out_signature="")
	def Set(self, interface, key, value):
		print("Set (%s, %s)" % (key, value), file=sys.stderr)
		return

	@dbus.service.signal("org.freedesktop.DBus.Properties",
							signature="sa{sv}as")
	def PropertiesChanged(self, interface, properties,
						invalidated = dbus.Array()):
		"""PropertiesChanged(interface, properties, invalidated)

		Send a PropertiesChanged signal. 'properties' is a dictionary
		containing string parameters as specified in doc/media-api.txt.
		"""
		pass

	def help(self, func):
		help(self.__class__.__dict__[func])

	def properties_changed(self, interface, properties, invalidated):
		print("properties_changed(%s, %s)" % (properties, invalidated))

		self.PropertiesChanged(interface, properties, invalidated)

class InputHandler:
	commands = { 'PropertiesChanged': '(interface, properties)',
			'help': '(cmd)' }
	def __init__(self, player):
		self.player = player
		print('\n\nAvailable commands:')
		for cmd in self.commands:
			print('\t', cmd, self.commands[cmd], sep='')

		print("\nUse python syntax to pass arguments to available methods.\n" \
                "E.g.: PropertiesChanged({'Metadata' : {'Title': 'My title', \
		'Album': 'my album' }})")
		self.prompt()

	def prompt(self):
		print('\n>>> ', end='')
		sys.stdout.flush()

	def handle(self, fd, condition):
		s = os.read(fd.fileno(), 1024).strip()
		try:
			cmd = s[:s.find('(')]
			if not cmd in self.commands:
				print("Unknown command ", cmd)
		except ValueError:
			print("Malformed command")
			return True

		try:
			exec "self.player.%s" % s
		except Exception as e:
			print(e)
			pass
		self.prompt()
		return True


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

	bus = dbus.SystemBus()

	if len(sys.argv) > 1:
		path = bluezutils.find_adapter(sys.argv[1]).object_path
	else:
		path = bluezutils.find_adapter().object_path

	media = dbus.Interface(bus.get_object("org.bluez", path),
						"org.bluez.Media1")

	path = "/test/player"
	player = Player(bus, path)
	mainloop = GObject.MainLoop()

	if len(sys.argv) > 2:
		player.set_object(sys.argv[2])
	else:
		player.set_object()

	print('Register media player with:\n\tProperties: %s' \
						% (player.properties))

	media.RegisterPlayer(dbus.ObjectPath(path), player.properties)

	mainloop.run()
