from enigma import eTimer, ePicLoad, iServiceInformation
from Screens.Screen import Screen
from Components.Label import Label
from Components.Button import Button
from Screens.ServiceInfo import ServiceInfoList, ServiceInfoListEntry
from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
from Components.Pixmap import Pixmap
from Components.ScrollLabel import ScrollLabel
from Tools.LoadPixmap import LoadPixmap
from Components.SelectionList import SelectionList, SelectionEntryComponent
from Components.ChoiceList import ChoiceEntryComponent, ChoiceList
from Components.Sources.List import List
from Components.Sources.StaticText import StaticText
from Tools.Directories import fileExists, pathExists, createDir
from Components.Console import Console
from Components.AVSwitch import AVSwitch
from Components.MenuList import MenuList
from _ctypes import *
from __init__ import _

class InfoBarAspectSelection:
	STATE_HIDDEN = 0
	STATE_ASPECT = 1
	STATE_RESOLUTION = 2
	def __init__(self):
		self["AspectSelectionAction"] = HelpableActionMap(self, "InfobarAspectSelectionActions",
			{
				"aspectSelection": (self.ExGreen_toggleGreen, _("Aspect list...")),
			})
		self.__ExGreen_state = self.STATE_HIDDEN
	def ExGreen_doAspect(self):
		self.__ExGreen_state = self.STATE_ASPECT
		self.aspectSelection()
	def ExGreen_doResolution(self):
		self.__ExGreen_state = self.STATE_RESOLUTION
		self.resolutionSelection()
	def ExGreen_doHide(self):
		self.__ExGreen_state = self.STATE_HIDDEN
	def ExGreen_toggleGreen(self, arg=""):
		print self.__ExGreen_state
		if self.__ExGreen_state == self.STATE_HIDDEN:
			print "self.STATE_HIDDEN"
			self.ExGreen_doAspect()
		elif self.__ExGreen_state == self.STATE_ASPECT:
			print "self.STATE_ASPECT"
			self.ExGreen_doResolution()
		elif self.__ExGreen_state == self.STATE_RESOLUTION:
			print "self.STATE_RESOLUTION"
			self.ExGreen_doHide()
	def aspectSelection(self):
		selection = 0
		tlist = []
		tlist.append((_("Resolution"), "resolution"))
		tlist.append(("", ""))
		tlist.append(("Letterbox", "letterbox"))
		tlist.append(("PanScan", "panscan"))
		tlist.append(("Non Linear", "non"))
		tlist.append(("Bestfit", "bestfit"))
		mode = open("/proc/stb/video/policy").read()[:-1]
		print mode
		for x in range(len(tlist)):
			if tlist[x][1] == mode:
				selection = x
		keys = ["green", "",  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
		self.session.openWithCallback(self.aspectSelected, MC_ChoiceBox, title=_("Please select an aspect ratio..."), list = tlist, selection = selection, keys = keys)
	def aspectSelected(self, aspect):
		if not aspect is None:
			if isinstance(aspect[1], str):
				if aspect[1] == "resolution":
					self.ExGreen_toggleGreen()
				else:
					open("/proc/stb/video/policy", "w").write(aspect[1])
					self.ExGreen_doHide()
		return

class MC_AudioInfoView(Screen):
	skin = """<screen position="center,center" size="560,320" title="View Audio Info" >
		<widget source="show_title" render="Label" position="-100,-100" zPosition="0" size="1,1" font="Regular;1" valign="center" halign="center" transparent="1" />
		<widget name="infolist" position="5,5" size="550,310" selectionDisabled="1" />
	</screen>"""

	def __init__(self, session, fullname, name, ref):
		self.skin = MC_AudioInfoView.skin
		Screen.__init__(self, session)
		self["actions"] = ActionMap(["OkCancelActions"],
		{
			"cancel": self.close,
			"ok": self.close
		}, -1)
		tlist = [ ]
		self["show_title"] = StaticText(_("MediaCenter Audiofile Info"))
		self["infolist"] = ServiceInfoList(tlist)
		currPlay = self.session.nav.getCurrentService()
		if currPlay is not None:
			sTagTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle)
			if sTagTitle == "":
				sTagTitle = currPlay.info().getName().split('/')[-1]
			tlist.append(ServiceInfoListEntry("Title: ", sTagTitle))
			tlist.append(ServiceInfoListEntry("Artist: ", currPlay.info().getInfoString(iServiceInformation.sTagArtist)))
			tlist.append(ServiceInfoListEntry("Album: ", currPlay.info().getInfoString(iServiceInformation.sTagAlbum)))
			tlist.append(ServiceInfoListEntry("Genre: ", currPlay.info().getInfoString(iServiceInformation.sTagGenre)))
			tlist.append(ServiceInfoListEntry("Year: ", currPlay.info().getInfoString(iServiceInformation.sTimeCreate)))
			tlist.append(ServiceInfoListEntry("Comment: ", currPlay.info().getInfoString(iServiceInformation.sTagComment)))

class Showiframe():
	def __init__(self):
		self.showiframe = dlopen("/usr/lib/enigma2/python/Plugins/Extensions/MediaCenter/libshowiframe.so.0.0.0")
		try:
			self.showSinglePic = dlsym(self.showiframe, "showSinglePic")
			self.finishShowSinglePic = dlsym(self.showiframe, "finishShowSinglePic")
		except OSError, e: 
			self.showSinglePic = dlsym(self.showiframe, "_Z13showSinglePicPKc")
			self.finishShowSinglePic = dlsym(self.showiframe, "_Z19finishShowSinglePicv")

	def showStillpicture(self, pic):
		call_function(self.showSinglePic, (pic, ))

	def finishStillPicture(self):
		call_function(self.finishShowSinglePic, ())
		#dlclose(self.showiframe)

class MC_VideoImdbView(Screen):
	skin = """<screen position="0,0" size="1024,576" title="Imdbfile Info" >
		<!--widget name="thumbbig" position="0,0" size="1280,720" zPosition="0" transparent="1" alphatest="on" />
		<widget name="thumb" position="700,50" size="190,174" zPosition="2" transparent="1" alphatest="on" /-->
		<widget name="thumbCoverBig" position="518,20" size="471,536" zPosition="2" transparent="1" alphatest="on" />
		<widget name="thumbPosterMid" position="518,20" size="471,536" zPosition="3" transparent="1" alphatest="on" />
		<widget name="imdbinfo" font="Regular;18" position="35,30" size="480,500" zPosition="4" transparent="1" />
		<eLabel backgroundColor="green" position="326,555" size="140,3" zPosition="5"/>
		<eLabel backgroundColor="red" position="93,555" size="140,3" zPosition="5"/>
		<widget name="key_red" position="93,526" zPosition="5" size="140,40" font="Regular;18" valign="center" halign="center" transparent="1" />
		<widget name="key_green" position="326,526" zPosition="5" size="140,40" font="Regular;18" valign="center" halign="center" transparent="1" />
	</screen>"""
			
	def __init__(self, session, showtext, dirCover, dirCoverBig, dirPosterOrginal, dirPosterMid, dirPosterThumb, dirPosterCover, dirPosterPreview, dirBanner, dirBackdrop, dirMvi, savedir, moviename, showinfo):
		self.skin = MC_VideoImdbView.skin
		Screen.__init__(self, session)
		self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
		{
			"cancel": self.exit,
			"ok": self.save,
			"upUp": self.pageUp,
			"downUp": self.pageDown,
			"red": self.exit,
			"green": self.save,
		}, -1)

		self.showinfo = showinfo
		self.showtext = showtext

		self.savetext = showtext
		self.dirCover = dirCover
		self.dirCoverBig = dirCoverBig
		self.dirPosterOrginal = dirPosterOrginal
		self.dirPosterMid = dirPosterMid
		self.dirPosterThumb = dirPosterThumb
		self.dirPosterCover = dirPosterCover
		self.dirPosterPreview = dirPosterPreview
		self.dirBanner = dirBanner
		self.dirBackdrop = dirBackdrop
		self.dirMvi = dirMvi
		self.savedir = savedir
		self.moviename = moviename

#--- INFO: you can set these parameters in the skin.xml of your own skin. Default is...
		self.picX = 200 # picturesize x
		self.picY = 350 # picturesize y
#----------

		self.FramebufferScale = AVSwitch().getFramebufferScale()
		self.picload = ePicLoad()
		self.picload.PictureData.get().append(self.showScaledPixmap)
		self.picload2 = ePicLoad()
		self.picload2.PictureData.get().append(self.showScaledPixmap2)

		self["imdbinfo"] = ScrollLabel()
		self["thumbCoverBig"] = Pixmap()
		self["thumbPosterMid"] = Pixmap()
		if self.show == False:
			self["key_red"] = Button(_("Cancel"))
			self["key_green"] = Button(_("Save"))
		else:
			self["key_red"] = Button(_("Back"))
			self["key_green"] = Button(_("OK"))
#--- INFO: the screen gets started from an applet in the skin.xml ....
		#self.onLayoutFinish.append(self.showPic)
#----------

	def showPic(self):
		self["imdbinfo"].setText("Imdb Details:\n-----------------\n\n" + str(self.showtext))
		self.picload.setPara((self.picX, self.picY, self.FramebufferScale[0], self.FramebufferScale[1], True, 1, "#00000000"))
		self.picload2.setPara((self.picX, self.picY, self.FramebufferScale[0], self.FramebufferScale[1], True, 1, "#00000000"))
		self.start_decode()
		self.start_decode2()

	def start_decode(self):
		if fileExists(self.dirCoverBig):
			self.picload.startDecode(self.dirCoverBig)
		else:
			self.picload.startDecode(self.dirPosterMid)

	def start_decode2(self):
		if fileExists(self.dirPosterMid):
			self.picload2.startDecode(self.dirPosterMid)
		else:
			self.picload2.startDecode(self.dirCoverBig)

	def showScaledPixmap(self, picInfo=None):
		ptr = self.picload.getData()
		if ptr != None:
			self["thumbCoverBig"].instance.setPixmap(ptr.__deref__())

	def showScaledPixmap2(self, picInfo=None):
		ptr = self.picload2.getData()
		if ptr != None:
			self["thumbPosterMid"].instance.setPixmap(ptr.__deref__())
		self["thumbPosterMid"].hide()

	def pageUp(self):
		self["imdbinfo"].pageUp()
		self["thumbCoverBig"].show()
		self["thumbPosterMid"].hide()

	def pageDown(self):
		self["imdbinfo"].pageDown()
		self["thumbPosterMid"].show()
		self["thumbCoverBig"].hide()

	def exit(self):
		Console().ePopen(('rm /tmp/*.jpg;rm /tmp/*.cache'))
		self.close()

	def save(self):	
		if self.showinfo == False:
			print "startsaving closed"
			from MC_Imdb import saveImdb
			saveImdb(self.moviename,str(self.savetext))
		self.close()

class MC_VideoPlaylistInfoView(Screen):
	skin = """<screen position="center,center" size="720,430" title="Playlist Info" >
		<widget name="playlist" font="Regular;18" position="10,10" size="700,380" zPosition="2" transparent="1" />
		<widget source="show_title" render="Label" position="-100,-100" zPosition="0" size="1,1" font="Regular;1" valign="center" halign="center" transparent="1" />
		<eLabel backgroundColor="red" position="93,420" size="140,3" zPosition="5"/>
		<eLabel backgroundColor="green" position="526,420" size="140,3" zPosition="5"/>
		<widget name="key_red" position="93,390" zPosition="4" size="140,40" font="Regular;18" valign="center" halign="center" transparent="1" />
		<widget name="key_green" position="526,390" zPosition="4" size="140,40" font="Regular;18" valign="center" halign="center" transparent="1" />
	</screen>"""

	def __init__(self, session, showtext, playlist):
		self.skin = MC_VideoPlaylistInfoView.skin
		self.playlist = playlist
		Screen.__init__(self, session)
		self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
		{
			"cancel": self.close,
			"ok": self.close,
			"upUp": self.pageUp,
			"downUp": self.pageDown,
			"red": self.close,
			"green": self.sort,
		}, -1)

		self["playlist"] = ScrollLabel()
		self["playlist"].setText(showtext)
		self["show_title"] = StaticText(_("MediaCenter Videoplayer Playlist:"))
		self["key_red"] = Button(_("Cancel"))
		self["key_green"] = Button(_("Random"))

	def sort(self):
		if len(self.playlist.getServiceRefList()):
			self.playlist.PlayListShuffle()
			self.playlist.updateList()
			currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()]
			liste = self.playlist.getServiceRefList()
			count = 0
			text0 = "\n"
			text1 = "--------------"
			text5 = "PlayList:\n"
			bunner5 = "----------\n"
			headertext = text5 + text1 + text0
			text = ""
			for a in liste:
				count += 1
				files = a.getPath()
				name = files.split('/')[-1]
				text_playlist = "(" + str(count) + ")" + name + text0
				text += text_playlist
			showtext_playlist = headertext + text + text0 
			showtext = showtext_playlist
			self["playlist"].setText(showtext)

	def pageUp(self):
		self["playlist"].pageUp()

	def pageDown(self):
		self["playlist"].pageDown()

	def getIdentifier(self, ref):
		text = ref.getPath()
		return text.split('/')[-1]

class MC_ChoiceBox(Screen):
	def __init__(self, session, title = "", list = [], keys = None, selection = 0, skin_name = []):
		Screen.__init__(self, session)
		if isinstance(skin_name, str):
			skin_name = [skin_name]
		self.skinName = skin_name + ["MC_ChoiceBox"] 
		self["text"] = Label(title)
		self.list = []
		self.summarylist = []
		if keys is None:
			self.__keys = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "red", "green", "yellow", "blue" ] + (len(list) - 10) * [""]
		else:
			self.__keys = keys + (len(list) - len(keys)) * [""]
		self.keymap = {}
		pos = 0
		for x in list:
			strpos = str(self.__keys[pos])
			self.list.append(ChoiceEntryComponent(key = strpos, text = x))
			if self.__keys[pos] != "":
				self.keymap[self.__keys[pos]] = list[pos]
			self.summarylist.append((self.__keys[pos],x[0]))
			pos += 1
		self["list"] = ChoiceList(list = self.list, selection = selection)
		self["summary_list"] = StaticText()
		self.updateSummary()
		self["actions"] = NumberActionMap(["WizardActions", "InputActions", "ColorActions", "DirectionActions"], 
		{
			"ok": self.go,
			"back": self.cancel,
			"1": self.keyNumberGlobal,
			"2": self.keyNumberGlobal,
			"3": self.keyNumberGlobal,
			"4": self.keyNumberGlobal,
			"5": self.keyNumberGlobal,
			"6": self.keyNumberGlobal,
			"7": self.keyNumberGlobal,
			"8": self.keyNumberGlobal,
			"9": self.keyNumberGlobal,
			"0": self.keyNumberGlobal,
			"red": self.keyRed,
			"green": self.keyGreen,
			"yellow": self.keyYellow,
			"blue": self.keyBlue,
			"up": self.up,
			"down": self.down
		}, -1)
	def keyLeft(self):
		pass
	def keyRight(self):
		pass
	def up(self):
		if len(self["list"].list) > 0:
			while 1:
				self["list"].instance.moveSelection(self["list"].instance.moveUp)
				self.updateSummary(self["list"].l.getCurrentSelectionIndex())
				if self["list"].l.getCurrentSelection()[0][0] != "--" or self["list"].l.getCurrentSelectionIndex() == 0:
					break
	def down(self):
		if len(self["list"].list) > 0:
			while 1:
				self["list"].instance.moveSelection(self["list"].instance.moveDown)
				self.updateSummary(self["list"].l.getCurrentSelectionIndex())
				if self["list"].l.getCurrentSelection()[0][0] != "--" or self["list"].l.getCurrentSelectionIndex() == len(self["list"].list) - 1:
					break
	# runs a number shortcut
	def keyNumberGlobal(self, number):
		self.goKey(str(number))
	# runs the current selected entry
	def go(self):
		cursel = self["list"].l.getCurrentSelection()
		if cursel:
			self.goEntry(cursel[0])
		else:
			self.cancel()
	# runs a specific entry
	def goEntry(self, entry):
		if len(entry) > 2 and isinstance(entry[1], str) and entry[1] == "CALLFUNC":
			# CALLFUNC wants to have the current selection as argument
			arg = self["list"].l.getCurrentSelection()[0]
			entry[2](arg)
		else:
			self.close(entry)
	# lookups a key in the keymap, then runs it
	def goKey(self, key):
		if self.keymap.has_key(key):
			entry = self.keymap[key]
			self.goEntry(entry)
	# runs a color shortcut
	def keyRed(self):
		self.goKey("red")
	def keyGreen(self):
		self.goKey("green")
	def keyYellow(self):
		self.goKey("yellow")
	def keyBlue(self):
		self.goKey("blue")
	def updateSummary(self, curpos=0):
		pos = 0
		summarytext = ""
		for entry in self.summarylist:
			if pos > curpos-2 and pos < curpos+5:
				if pos == curpos:
					summarytext += ">"
				else:
					summarytext += entry[0]
				summarytext += ' ' + entry[1] + '\n'
			pos += 1
		self["summary_list"].setText(summarytext)
	def cancel(self):
		self.close(None)

class MC_MessageBox(Screen):
	TYPE_YESNO = 0
	TYPE_INFO = 1
	TYPE_WARNING = 2
	TYPE_ERROR = 3
	def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True, msgBoxID = None):
		self.type = type
		Screen.__init__(self, session)
		
		self.msgBoxID = msgBoxID
		self["text"] = Label(text)
		self["Text"] = StaticText(text)
		self["selectedChoice"] = StaticText()
		self.text = text
		self.close_on_any_key = close_on_any_key
		self["ErrorPixmap"] = Pixmap()
		self["QuestionPixmap"] = Pixmap()
		self["InfoPixmap"] = Pixmap()
		self.timerRunning = False
		self.initTimeout(timeout)
		self.list = []
		if type != self.TYPE_ERROR:
			self["ErrorPixmap"].hide()
		if type != self.TYPE_YESNO:
			self["QuestionPixmap"].hide()
		if type != self.TYPE_INFO:
			self["InfoPixmap"].hide()
		if type == self.TYPE_YESNO:
			if default == True:
				self.list = [ (_("yes"), 0), (_("no"), 1) ]
			else:
				self.list = [ (_("no"), 1), (_("yes"), 0) ]
		if self.list:
			self["selectedChoice"].setText(self.list[0][0])
		self["list"] = MenuList(self.list)
		if enable_input:
			self["actions"] = ActionMap(["MsgBoxActions", "DirectionActions"], 
				{
					"cancel": self.cancel,
					"ok": self.ok,
					"alwaysOK": self.alwaysOK,
					"up": self.up,
					"down": self.down,
					"left": self.left,
					"right": self.right,
					"upRepeated": self.up,
					"downRepeated": self.down,
					"leftRepeated": self.left,
					"rightRepeated": self.right
				}, -1)
	def initTimeout(self, timeout):
		self.timeout = timeout
		if timeout > 0:
			self.timer = eTimer()
			self.timer.callback.append(self.timerTick)
			self.onExecBegin.append(self.startTimer)
			self.origTitle = None
			if self.execing:
				self.timerTick()
			else:
				self.onShown.append(self.__onShown)
			self.timerRunning = True
		else:
			self.timerRunning = False
	def __onShown(self):
		self.onShown.remove(self.__onShown)
		self.timerTick()
	def startTimer(self):
		self.timer.start(1000)
	def stopTimer(self):
		if self.timerRunning:
			del self.timer
			self.onExecBegin.remove(self.startTimer)
			self.setTitle(self.origTitle)
			self.timerRunning = False
	def timerTick(self):
		if self.execing:
			self.timeout -= 1
			if self.origTitle is None:
				self.origTitle = self.instance.getTitle()
			self.setTitle(self.origTitle + " (" + str(self.timeout) + ")")
			if self.timeout == 0:
				self.timer.stop()
				self.timerRunning = False
				self.timeoutCallback()
	def timeoutCallback(self):
		print "Timeout!"
		self.ok()
	def cancel(self):
		self.close(False)
	def ok(self):
		if self.type == self.TYPE_YESNO:
			self.close(self["list"].getCurrent()[1] == 0)
		else:
			self.close(True)
	def alwaysOK(self):
		self.close(True)
	def up(self):
		self.move(self["list"].instance.moveUp)
	def down(self):
		self.move(self["list"].instance.moveDown)
	def left(self):
		self.move(self["list"].instance.pageUp)
	def right(self):
		self.move(self["list"].instance.pageDown)
	def move(self, direction):
		if self.close_on_any_key:
			self.close(True)
		self["list"].instance.moveSelection(direction)
		if self.list:
			self["selectedChoice"].setText(self["list"].getCurrent()[0])
		self.stopTimer()
	def __repr__(self):
		return str(type(self)) + "(" + self.text + ")"