import random, os, time, shutil, sys
from threading import Timer
import remi.gui as gui
from remi import App
from utils import Namespace, call_as_thread, get_youtube_metadata

import api

#globals:
COLOR_BLUE = "rgb(33, 150, 243)"
COLOR_BLUE_SHADOW = "rgba(33, 150, 243, 0.75)"

class MyApp(App):
	def __init__(self, *args):
		res_path = os.path.join(os.path.dirname(__file__), 'res')
		super(MyApp, self).__init__(*args, static_file_path=res_path)

	def main(self):
		container = gui.VBox(width=512)
		container.style["margin-left"] = "auto"
		container.style["margin-right"] = "auto"
		
		#logo:
		container.append(gui.Image('/res/logo.jpg', width=512))
		
		#playback controls
		playbackContainer = gui.HBox()#; container.append(playbackContainer)
		
		self.playback = Namespace()
		for i in ("previous", "play", "next"):
			button = gui.Button(i.capitalize(), margin="5px")
			setattr(self.playback, i, button)
			playbackContainer.append(button)
			button.set_on_click_listener(getattr(self,'playback_%s' % i))
		
		self.playback.playing = gui.Label("Now playing: None")
		self.playback.slider = gui.Slider(0, 0, 100, 1, width="85%", height=20, margin='10px')
		
		container.append(self.playback.playing)
		container.append(playbackContainer)
		container.append(self.playback.slider)
		
		#playlist
		self.playlist = Namespace()
		self.playlist.table = gui.Table(width="100%", margin="10px")
		self.playlist.table.append_from_list([['#', 'Name', "length"]], fill_title=True)
		
		container.append(self.playlist.table)
		
		#input
		container.append(gui.Label("Add songs:"))
		inputContainer = gui.HBox(width=512)
		self.input = Namespace()
		self.input.field = gui.TextInput(single_line=True, height="20px", margin="5px")
		self.input.field.style["border"]     = "1px solid %s" % COLOR_BLUE
		self.input.field.style["box-shadow"] = "0px 0px 5px 0px %s" % COLOR_BLUE_SHADOW
		self.input.submit = gui.Button("Submit!", margin="5px")
		self.input.field.set_on_enter_listener(self.input_submit)
		self.input.submit.set_on_click_listener(self.input_submit)
		
		inputContainer.append(self.input.field)
		inputContainer.append(self.input.submit)
		container.append(inputContainer)
		
		#return the container
		self.mainLoop()
		return container
	def mainLoop(self):
		#self.playback.slider.get_value()
		
		self.playback_update()
		self.playlist_update()
		
		
		Timer(0.7, self.mainLoop).start()

	# events:
	@call_as_thread
	def playback_previous(self, widget):
		api.playlist_previous()
	@call_as_thread
	def playback_play(self, widget):# toggle playblack
		if api.is_playing():
			self.playback.play.set_text("Play")
			api.set_playing(False)
		else:
			self.playback.play.set_text("Pause")
			api.set_playing(True)
	@call_as_thread
	def playback_next(self, widget):
		api.playlist_next()
	@call_as_thread
	def input_submit(self, widget, value=None):
		if value is None:
			value = self.input.field.get_text()
		self.input.field.set_text("")
		
		# (TODO):
		# title, length = utils.get_youtube_metadata(value)
		api.load_path(value)

	# playback steps:
	@call_as_thread
	def playback_update(self):
		play_label = "Pause" if api.is_playing() else "Play"
		playback_pos = random.randrange(0,100)
		
		#print(dir(self.playback.play))
		self.playback.play.set_text(play_label)
		self.playback.slider.set_value(playback_pos)
	@call_as_thread
	def volume_update(self):
		self.volume.slider.set_value(api.get_volume())
	@call_as_thread
	def playlist_update(self):
		playlist = api.get_playlist()
		
		table = []
		for item in playlist:
			table.append([
				item["index"],
				item["filename"],
				"05:00" + ("#"*("current" in item))
			])

		self.playlist.table.empty(keep_title=True)
		self.playlist.table.append_from_list(table)