class RPiMediaPlayerController(NSWindowController):

    audio_formats = ['mp3','mpa','flac','ogg','wav','wma','m4a']
    video_formats = ['avi','wmv','mpg','mpeg','mp4','mkv','m4v','m2v','mpv','ogv','flv','mov'] 
    media_patterns = re.compile(".*\.("+"|".join(audio_formats+video_formats)+")$", re.IGNORECASE)

    hostnameField = objc.IBOutlet()
    usernameField = objc.IBOutlet()
    passwordField = objc.IBOutlet()
    filenameField = objc.IBOutlet()
    messageField  = objc.IBOutlet()
    nowPlayingField = objc.IBOutlet()

    playButton = objc.IBOutlet()
    fButton    = objc.IBOutlet()
    ffButton   = objc.IBOutlet()
    bButton    = objc.IBOutlet()
    bbButton   = objc.IBOutlet()
    stopButton = objc.IBOutlet()
    volupButton   = objc.IBOutlet()
    voldownButton = objc.IBOutlet()
    
    uploadButton = objc.IBOutlet()

    playButtons = (
            'playButton',
            'fButton',
            'ffButton',
            'bButton',
            'bbButton',
            'stopButton',
            'volupButton',
            'voldownButton',
            )
    
    def setPlayButtons(self,enable):
        for button in self.playButtons:
            eval('self.{}'.format(button)).setEnabled_(enable)

    def scp_and_play(self):
        self.scp_handler = SCPHandler(self.hostname,self.username,self.password)
        self.remote_file = "/tmp/{}".format(self.filename.split("/")[-1])
        self.scp_handler.scp(self.filename,self.remote_file)
        filename = self.filename.split("/")[-1].replace("\\","")
        self.messageField.setStringValue_("Upload starting...")
        time.sleep(0.5)
        while self.scp_handler.progress != 100:
            time.sleep(0.1)
            message = "Uploading {filename} to {remote}\nProgress: {p}%".format(
                                filename=filename,
                                remote=self.hostname,
                                p=self.scp_handler.progress)
            self.messageField.setStringValue_(message)
        
        message = "Uploading {filename} to {remote}\nProgress: Done".format(
                                filename=filename,
                                remote=self.hostname)
        self.messageField.setStringValue_(message)
        
        # start player
        self.omxplayer = OMXPlayer(self.hostname, self.username, self.password)
        self.omxplayer.play(self.remote_file)
        self.nowPlayingField.setStringValue_("Currently Playing:\n{}".format(filename))
        self.setPlayButtons(True)

        # poll for status of video
        # (don't start polling until omxplayer has had some time to get started)
        time.sleep(10)
        while self.omxplayer.playing:
            time.sleep(1)

        # reset when playing is done
        self.setPlayButtons(False)
        self.uploadButton.setEnabled_(True)
        self.nowPlayingField.setStringValue_("Nothing playing")

    def windowDidLoad(self):
        NSWindowController.windowDidLoad(self)
        self.setPlayButtons(False)

    @objc.IBAction
    def upload_(self, sender):
        self.hostname = self.hostnameField.stringValue()
        self.username = self.usernameField.stringValue()
        self.password = self.passwordField.stringValue()
        self.filename = self.filenameField.stringValue()
        if not os.path.isfile(self.filename):
            self.messageField.setStringValue_("File not found.")
            return
        if not self.media_patterns.match(self.filename):
            self.messageField.setStringValue_("Please only provide audio or video files")
            return
        self.uploadButton.setEnabled_(False)
        self.filename = string_to_path(self.filename)
        scp_and_play_thread = Thread(target=self.scp_and_play, args=())
        scp_and_play_thread.daemon = True
        scp_and_play_thread.start()
    
    @objc.IBAction
    def playpause_(self, sender):
        self.omxplayer.toggle_play()

    @objc.IBAction
    def f_(self, sender):
        self.omxplayer.f()

    @objc.IBAction
    def ff_(self, sender):
        self.omxplayer.ff()

    @objc.IBAction
    def b_(self, sender):
        self.omxplayer.b()

    @objc.IBAction
    def bb_(self, sender):
        self.omxplayer.bb()

    @objc.IBAction
    def volup_(self, sender):
        self.omxplayer.volup()

    @objc.IBAction
    def voldown_(self, sender):
        self.omxplayer.voldown()

    @objc.IBAction
    def stop_(self, sender):
        self.omxplayer.close()
        self.setPlayButtons(False)
        self.uploadButton.setEnabled_(True)
        self.nowPlayingField.setStringValue_("Nothing playing")