import sys
import xbmc
import xbmcgui
import xbmcaddon
import json as json
import urllib
from DownloadUtils import DownloadUtils
from API import API


_MODE_BASICPLAY=12
_MODE_CAST_LIST=14
_MODE_PERSON_DETAILS=15
CP_ADD_URL = 'plugin://plugin.video.couchpotato_manager/movies/add?title='
CP_ADD_VIA_IMDB = 'plugin://plugin.video.couchpotato_manager/movies/add?imdb_id='


class ItemInfo(xbmcgui.WindowXMLDialog):

    id = ""
    playUrl = ""
    trailerUrl = ""
    couchPotatoUrl = ""
    userid = ""
    server = ""
    downloadUtils = DownloadUtils()
    item= []
    isTrailer = False
    
    def __init__(self, *args, **kwargs):
        xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
        xbmc.log("WINDOW INITIALISED")

    def onInit(self):
        self.action_exitkeys_id = [10, 13]
        url = "{server}/mediabrowser/Users/{UserId}/Items/" + self.id + "?Fields=SeriesGenres,AirTime&format=json"
        item = self.downloadUtils.downloadUrl(url)     
        self.item = item
        
        id = item.get("Id")
        WINDOW = xbmcgui.Window( 10025 )
        WINDOW.setProperty('ItemGUID', id)
        
        name = item.get("Name")
        image = API().getArtwork(item, "poster")
        fanArt = API().getArtwork(item, "BackdropNoIndicators")
        self.getControl(3001).setImage(fanArt)
        
        discart = API().getArtwork(item ,"Disc")
        logo = API().getArtwork(item ,"Logo")
        # calculate the percentage complete
        userData = item.get("UserData")
        cappedPercentage = 0
        
        if(userData != None):
            playBackTicks = float(userData.get("PlaybackPositionTicks"))
            if(playBackTicks != None and playBackTicks > 0):
                runTimeTicks = float(item.get("RunTimeTicks", "0"))
                if(runTimeTicks > 0):
                    percentage = int((playBackTicks / runTimeTicks) * 100.0)
                    cappedPercentage = percentage - (percentage % 10)
                    if(cappedPercentage == 0):
                        cappedPercentage = 10
                    if(cappedPercentage == 100):
                        cappedPercentage = 90
            
            try:
                watchedButton = self.getControl(3192)
            except:
                watchedButton = None
            if(watchedButton != None):
                if userData.get("Played") == True:
                    watchedButton.setSelected(True)
                else:
                    watchedButton.setSelected(False)
            
            try:
                dislikeButton = self.getControl(3193)
            except:
                dislikeButton = None            
            if(dislikeButton != None):
                if userData.get("Likes") != None and userData.get("Likes") == False:
                    dislikeButton.setSelected(True)
                else:
                    dislikeButton.setSelected(False)
                    
            try:
                likeButton = self.getControl(3194)
            except:
                likeButton = None                       
            if(likeButton != None):
                if userData.get("Likes") != None and userData.get("Likes") == True:
                    likeButton.setSelected(True)
                else:
                    likeButton.setSelected(False)
                    
            try:
                favouriteButton = self.getControl(3195)
            except:
                favouriteButton = None
            if(favouriteButton != None):
                if userData.get("IsFavorite") == True:
                    favouriteButton.setSelected(True)
                else:
                    favouriteButton.setSelected(False)
          
        
        episodeInfo = ""
        type = item.get("Type")
        WINDOW.setProperty('ItemType', type)
        if(type == "Episode" or type == "Season"):
            WINDOW.setProperty('ItemGUID', item.get("SeriesId"))
            name = item.get("SeriesName") + ": " + name
            season = str(item.get("ParentIndexNumber")).zfill(2)
            episodeNum = str(item.get("IndexNumber")).zfill(2)
            episodeInfo = "S" + season + "xE" + episodeNum
        elif type == "Movie":
            if item.get("Taglines") != None and item.get("Taglines") != [] and item.get("Taglines")[0] != None:
                episodeInfo = item.get("Taglines")[0]
        elif type == "ChannelVideoItem":
            if item.get("ExtraType") != None:
                if item.get('ExtraType') == "Trailer":
                    self.isTrailer = True
                
            
        self.playUrl = "plugin://plugin.video.emby/?id=%s&mode=play" % id
            
        try:
            trailerButton = self.getControl(3102)
            if(trailerButton != None):
                if not self.isTrailer and item.get("LocalTrailerCount") != None and item.get("LocalTrailerCount") > 0:
                    itemTrailerUrl = "{server}/mediabrowser/Users/{UserId}/Items/" + id + "/LocalTrailers?format=json"
                    jsonData = self.downloadUtils.downloadUrl(itemTrailerUrl)
                    if(jsonData != ""): 
                        trailerItem = jsonData
                        self.trailerUrl = "plugin://plugin.video.emby/trailer/?id=%s&mode=play" % trailerItem[0][u'Id'] 
                else:
                    trailerButton.setEnabled(False)
        except:
            pass
        
        try:
            couchPotatoButton = self.getControl(3103)
            if(couchPotatoButton != None):
                if self.isTrailer and item.get("ProviderIds") != None and item.get("ProviderIds").get("Imdb") != None:
                    self.couchPotatoUrl = CP_ADD_VIA_IMDB + item.get("ProviderIds").get("Imdb")
                elif self.isTrailer:
                    self.couchPotatoUrl = CP_ADD_URL + name
                elif not self.isTrailer:
                    couchPotatoButton.setEnabled(False)
        except:
            pass

        # all the media stream info
        mediaList = self.getControl(3220)
        
        mediaStreams = item.get("MediaStreams")
        if(mediaStreams != None):
            for mediaStream in mediaStreams:
                if(mediaStream.get("Type") == "Video"):
                    videocodec = mediaStream.get("Codec")
                    if(videocodec == "mpeg2video"):
                        videocodec = "mpeg2"
                    height = str(mediaStream.get("Height"))
                    width = str(mediaStream.get("Width"))
                    aspectratio = mediaStream.get("AspectRatio")
                    fr = mediaStream.get("RealFrameRate")
                    videoInfo = width + "x" + height + " " + videocodec + " " + str(round(fr, 2))
                    listItem = xbmcgui.ListItem("Video:", videoInfo)
                    mediaList.addItem(listItem)
                if(mediaStream.get("Type") == "Audio"):
                    audiocodec = mediaStream.get("Codec")
                    channels = mediaStream.get("Channels")
                    lang = mediaStream.get("Language")
                    audioInfo = audiocodec + " " + str(channels)
                    if(lang != None and len(lang) > 0 and lang != "und"):
                        audioInfo = audioInfo + " " + lang
                    listItem = xbmcgui.ListItem("Audio:", audioInfo)
                    mediaList.addItem(listItem)
                if(mediaStream.get("Type") == "Subtitle"):
                    lang = mediaStream.get("Language")
                    codec = mediaStream.get("Codec")
                    subInfo = codec
                    if(lang != None and len(lang) > 0 and lang != "und"):
                        subInfo = subInfo + " " + lang
                    listItem = xbmcgui.ListItem("Sub:", subInfo)
                    mediaList.addItem(listItem)

        
        #for x in range(0, 10):
        #    listItem = xbmcgui.ListItem("Test:", "Test 02 " + str(x))
        #    mediaList.addItem(listItem)
        
        # add overview
        overview = item.get("Overview")
        self.getControl(3223).setText(overview)
        
        # add people
        peopleList = self.getControl(3230)
        people = item.get("People")
        director=''
        writer=''
        for person in people:
            displayName = person.get("Name")
            if person.get("Role") != None and person.get("Role") != '':
               role = "as " + person.get("Role")
            else:
               role = ''
            id = person.get("Id")
            tag = person.get("PrimaryImageTag")
            
            baseName = person.get("Name")
            baseName = baseName.replace(" ", "+")
            baseName = baseName.replace("&", "_")
            baseName = baseName.replace("?", "_")
            baseName = baseName.replace("=", "_")
            
            actionUrl = "plugin://plugin.video.emby?mode=person&name=" + baseName
            
            if(tag != None and len(tag) > 0):
                thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 400, 400)
                listItem = xbmcgui.ListItem(label=displayName, label2=role, iconImage=thumbPath, thumbnailImage=thumbPath)
            else:
                listItem = xbmcgui.ListItem(label=displayName, label2=role)
                
            listItem.setProperty("ActionUrl", actionUrl)
            peopleList.addItem(listItem)
            if(person.get("Type") == "Director") and director =='':
                director = displayName
                if(tag != None and len(tag) > 0):
                  thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 580, 860)
                  directorlistItem = xbmcgui.ListItem("Director:", label2=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
                else:
                  directorlistItem = xbmcgui.ListItem("Director:", label2=displayName)
                directorlistItem.setProperty("ActionUrl", actionUrl)  
            if(person.get("Type") == "Writing") and writer == '':
                writer = person.get("Name")
                if(tag != None and len(tag) > 0):
                  thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 580, 860)
                  writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
                else:
                  writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName)
                writerlistItem.setProperty("ActionUrl", actionUrl) 
            if(person.get("Type") == "Writer") and writer == '':
                writer = person.get("Name")    
                if(tag != None and len(tag) > 0):
                  thumbPath = self.downloadUtils.imageUrl(id, "Primary", 0, 580, 860)
                  writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
                else:
                  writerlistItem = xbmcgui.ListItem("Writer:", label2=displayName)
                writerlistItem.setProperty("ActionUrl", actionUrl)
        # add general info
        infoList = self.getControl(3226)
        listItem = xbmcgui.ListItem("Year:", str(item.get("ProductionYear")))
        infoList.addItem(listItem)
        listItem = xbmcgui.ListItem("Rating:", str(item.get("CommunityRating")))
        infoList.addItem(listItem)          
        listItem = xbmcgui.ListItem("MPAA:", str(item.get("OfficialRating")))
        infoList.addItem(listItem)   
        duration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
        listItem = xbmcgui.ListItem("RunTime:", str(duration) + " Minutes")
        infoList.addItem(listItem) 
         
        genre = ""
        genres = item.get("Genres")
        if genres != None and genres != []:
            for genre_string in genres:
                if genre == "": #Just take the first genre
                    genre = genre_string
                else:
                    genre = genre + " / " + genre_string
        elif item.get("SeriesGenres") != None and item.get("SeriesGenres") != '':
            genres = item.get("SeriesGenres")
            if genres != None and genres != []:
              for genre_string in genres:
                if genre == "": #Just take the first genre
                    genre = genre_string
                else:
                    genre = genre + " / " + genre_string     

        genrelistItem = xbmcgui.ListItem("Genre:", genre)
        genrelistItem2 = xbmcgui.ListItem("Genre:", genre)
        infoList.addItem(genrelistItem) 
        
        path = item.get('Path')
        pathlistItem = xbmcgui.ListItem("Path:", path)
        pathlistItem2 = xbmcgui.ListItem("Path:", path)  
        infoList.addItem(pathlistItem)
       
        if item.get("CriticRating") != None:
            listItem = xbmcgui.ListItem("CriticRating:", str(item.get("CriticRating")))
            infoList.addItem(listItem)
               
        # Process Studio
        studio = "" 
        if item.get("SeriesStudio") != None and item.get("SeriesStudio") != '':
            studio = item.get("SeriesStudio")
        if studio == "":        
            studios = item.get("Studios")
            if(studios != None):
                for studio_string in studios:
                    if studio=="": #Just take the first one
                        temp=studio_string.get("Name")
                        studio=temp.encode('utf-8')
        
        if studio != "":
            listItem = xbmcgui.ListItem("Studio:", studio)
            infoList.addItem(listItem)
        
        if item.get("Metascore") != None:
          listItem = xbmcgui.ListItem("Metascore:", str(item.get("Metascore")))
          infoList.addItem(listItem)
          
        playCount = 0
        if(userData != None and userData.get("Played") == True):
            playCount = 1
        listItem = xbmcgui.ListItem("PlayedCount:", str(playCount))
        infoList.addItem(listItem)
        
        if item.get("ProviderIds") != None and item.get("ProviderIds").get("Imdb") != None and type == "Movie":
            listItem = xbmcgui.ListItem("ID:", item.get("ProviderIds").get("Imdb"))
            infoList.addItem(listItem)
        elif item.get("ProviderIds") != None and item.get("ProviderIds").get("Tvdb") != None and type == "Series":
            listItem = xbmcgui.ListItem("ID:", item.get("ProviderIds").get("Tvdb"))
            infoList.addItem(listItem)
        elif (type == "Episode" or type == "Season"):
            url = "{server}/mediabrowser/Users/{UserId}/Items/" + item.get("SeriesId") + "?Fields=SeriesGenres,AirTime&format=json"
            seriesitem = self.downloadUtils.downloadUrl(url)     
        
            if seriesitem.get("ProviderIds") != None and seriesitem.get("ProviderIds").get("Tvdb") != None:
              listItem = xbmcgui.ListItem("ID:", seriesitem.get("ProviderIds").get("Tvdb"))
              infoList.addItem(listItem)
        
        # alternate list 
        try:
            alternateList = self.getControl(3291)
            if alternateList != None:
                if directorlistItem != None:
                   alternateList.addItem(directorlistItem)
                if writerlistItem != None:
                   alternateList.addItem(writerlistItem)
                alternateList.addItem(genrelistItem2)
                if item.get("ProductionLocations") !=None and item.get("ProductionLocations") != []:
                   listItem = xbmcgui.ListItem("Country:", item.get("ProductionLocations")[0])
                   alternateList.addItem(listItem)
                elif item.get("AirTime") !=None:
                   listItem = xbmcgui.ListItem("Air Time:", item.get("AirTime"))
                   alternateList.addItem(listItem)
                if(item.get("PremiereDate") != None):
                   premieredatelist = (item.get("PremiereDate")).split("T")
                   premieredate = premieredatelist[0]
                   listItem = xbmcgui.ListItem("Premiered Date:", premieredate)
                   alternateList.addItem(listItem)
                alternateList.addItem(pathlistItem2)
                
        except:
            pass     

        self.getControl(3000).setLabel(name)
        self.getControl(3003).setLabel(episodeInfo)
        
        try:
            discartImageControl = self.getControl(3091)
            artImageControl = self.getControl(3092)
            thumbImageControl = self.getControl(3093)
            logoImageControl = self.getControl(3094)
            
            if discartImageControl != None and artImageControl != None and thumbImageControl != None and logoImageControl != None:
                
                if logo != "":
                  self.getControl(3094).setImage(logo)
                else:
                  self.getControl(3000).setVisible(True)
                     
                if discart != '':
                  self.getControl(3091).setImage(discart)
                  self.getControl(3092).setVisible(False)
                  self.getControl(3093).setVisible(False)
                else:
                  self.getControl(3091).setVisible(False)
                  art = API().getArtwork(item,"Art")
                  if (artImageControl != None):
                      if art != '':
                          self.getControl(3092).setImage(art)
                          self.getControl(3093).setVisible(False)
                      else:
                          self.getControl(3092).setVisible(False)
                          if (type == "Episode"):
                              thumb = API().getArtwork(item,"Thumb3")
                          else:
                              thumb = API().getArtwork(item,"Thumb")
                          if (thumbImageControl != None):
                              if thumb != '':
                                  self.getControl(3093).setImage(thumb)
                              else:
                                  self.getControl(3093).setVisible(False)
                          
                  
        except:
            pass 
        
        if(type == "Episode"):
            # null_pointer - I have removed this in favor of letting the user chose from the setting and using the "poster" type in the above image url create
            #image = API().getArtwork(seriesitem, "Primary")
            seriesimage = API().getArtwork(item, "SeriesPrimary")
            try:
                self.getControl(3099).setImage(seriesimage)
            except:
                pass
            
            self.getControl(3009).setImage(image)
            if(cappedPercentage != None):
                self.getControl(3010).setImage("Progress\progress_" + str(cappedPercentage) + ".png")
        else:
            self.getControl(3011).setImage(image)
            if(cappedPercentage != None):
                self.getControl(3012).setImage("Progress\progress_" + str(cappedPercentage) + ".png")
                
        # disable play button
        if(type == "Season" or type == "Series"):
            self.setFocusId(3226)
            self.getControl(3002).setEnabled(False)                 
        
    def setId(self, id):
        self.id = id
        
    def onFocus(self, controlId):      
        pass
        
    def doAction(self):
        pass

    def closeDialog(self):
        self.close()
        
    def onClick(self, controlID):
        
        if(controlID == 3002):
           
            # close all dialogs when playing an item
            xbmc.executebuiltin("Dialog.Close(all,true)")
            
            xbmc.executebuiltin("RunPlugin(" + self.playUrl + ")")
            self.close()
            
        elif(controlID == 3102):
           
            # close all dialogs when playing an item
            xbmc.executebuiltin("Dialog.Close(all,true)")
            
            xbmc.executebuiltin("RunPlugin(" + self.trailerUrl + ")")
            self.close()
            
        elif(controlID == 3103):
           
            # close all dialogs when playing an item
            xbmc.executebuiltin("Dialog.Close(all,true)")
            xbmc.executebuiltin("RunPlugin(" + self.couchPotatoUrl + ")")
            
        elif(controlID == 3230):
        
            peopleList = self.getControl(3230)
            item = peopleList.getSelectedItem()
            action = item.getProperty("ActionUrl")
            
            xbmc.log(action)
            xbmc.executebuiltin("RunPlugin(" + action + ")")
        elif(controlID == 3291):
        
            list = self.getControl(3291)
            item = list.getSelectedItem()
            action = item.getProperty("ActionUrl")
            
            xbmc.log(action)
            xbmc.executebuiltin("RunPlugin(" + action + ")")
        elif(controlID == 3192):
            url =  '{server}/mediabrowser/Users/{UserId}/PlayedItems/' + self.id           
            button = self.getControl(3192)
            watched = button.isSelected()
            if watched == True:
                self.postUrl(url)
            else:
                self.deleteUrl(url)
            self.onInit()
        elif(controlID == 3193):
            url =     '{server}/mediabrowser/Users/{UserId}/Items/' + self.id + '/Rating'        
            dislikebutton = self.getControl(3193)
            dislike = dislikebutton.isSelected()
            if dislike == True:
                url = url + '?likes=false'
                self.postUrl(url)
            else:
                self.deleteUrl(url)
            self.onInit()
        elif(controlID == 3194):
            url =     '{server}/mediabrowser/Users/{UserId}/Items/' + self.id + '/Rating'        
            likebutton = self.getControl(3194)
            like = likebutton.isSelected()
            if like == True:
                url = url + '?likes=true'
                self.postUrl(url)
            else:
                self.deleteUrl(url)
            self.onInit()
        elif(controlID == 3195):
            url = '{server}/mediabrowser/Users/{UserId}/FavoriteItems/' + self.id           
            button = self.getControl(3195)
            favourite = button.isSelected()
            if favourite == True:
                self.postUrl(url)
            else:
                self.deleteUrl(url)
            self.onInit()
        elif(controlID == 3006):                   
            url = "{server}/mediabrowser/Users/{UserId}/PlayingItems/" + self.id + "/Progress?PositionTicks=0"
            self.postUrl(url)
            self.onInit()
        pass
    
    def postUrl (self,url):
        self.downloadUtils.downloadUrl(url, postBody="", type="POST")  
    
    def deleteUrl (self,url):
        self.downloadUtils.downloadUrl(url, type="DELETE")