#!/usr/bin/env python


import vlc
import os
import json
from gmusicapi import Mobileclient
import os.path
from youtube_search_engine import youtube_search
from youtube_search_engine import youtube_stream_link
import yaml

ROOT_PATH = os.path.realpath(os.path.join(__file__, '..', '..'))
USER_PATH = os.path.realpath(os.path.join(__file__, '..', '..','..'))

with open('{}/src/config.yaml'.format(ROOT_PATH),'r') as conf:
    configuration = yaml.load(conf)

api = Mobileclient()
deviceid=[]
logged_in=api.oauth_login(Mobileclient.FROM_MAC_ADDRESS)
if logged_in:
    for device in api.get_registered_devices():
        if device['type']=='ANDROID':
            deviceid=device['id'][2:]
            print(deviceid)
            break
    if deviceid!=[]:
        api.logout()
        logged_in=api.oauth_login(deviceid)



class vlcplayer():

    def __init__(self):
        self.libvlc_Instance=vlc.Instance('--verbose 0')
        self.libvlc_player = self.libvlc_Instance.media_player_new()
        # self.libvlc_list_player = self.libvlc_Instance.media_list_player_new()
        # self.libvlc_Media_list = self.libvlc_Instance.media_list_new()
        # self.libvlc_list_player.set_media_player(self.libvlc_player)
        # self.libvlc_list_player.set_media_list(self.libvlc_Media_list)
        # self.libvlc_player_event_manager= self.libvlc_player.event_manager()

    def play_audio_file(self,fname):
        Instance=vlc.Instance()
        player=Instance.media_player_new()
        player.set_mrl(fname)
        player.play()

    def end_callback(self,event):
        if os.path.isfile("{}/.player.json".format(USER_PATH)):
            with open('{}/.player.json'.format(USER_PATH),'r') as input_file:
                  playerinfo= json.load(input_file)
            currenttrackid=playerinfo[0]
            loopstatus=playerinfo[2]
            numtracks=playerinfo[1]
            musictype=playerinfo[3]
            nexttrackid=currenttrackid+1
            playerinfo=[nexttrackid,numtracks,loopstatus,musictype]
            with open('{}/.player.json'.format(USER_PATH), 'w') as output_file:
                json.dump(playerinfo, output_file)
            if currenttrackid<numtracks:
                if musictype=='Google Music':
                    self.googlemusic_player(currenttrackid)
                if musictype=='YouTube':
                    self.youtube_player(currenttrackid)
                if musictype=='Spotify':
                    self.spotify_player(currenttrackid)
                if musictype=='Gaana':
                    self.gaana_player(currenttrackid)
                if musictype=='Deezer':
                    self.deezer_player(currenttrackid)

    def change_media_next(self):
        if os.path.isfile("{}/.player.json".format(USER_PATH)):
            with open('{}/.player.json'.format(USER_PATH),'r') as input_file:
                  playerinfo= json.load(input_file)
            currenttrackid=playerinfo[0]
            loopstatus=playerinfo[2]
            numtracks=playerinfo[1]
            musictype=playerinfo[3]
            nexttrackid=currenttrackid+1
            playerinfo=[nexttrackid,numtracks,loopstatus,musictype]
            with open('{}/.player.json'.format(USER_PATH), 'w') as output_file:
                json.dump(playerinfo, output_file)
            if currenttrackid<numtracks:
                if musictype=='Google Music':
                    self.googlemusic_player(currenttrackid)
                if musictype=='YouTube':
                    self.youtube_player(currenttrackid)
                if musictype=='Spotify':
                    self.spotify_player(currenttrackid)
                if musictype=='Gaana':
                    self.gaana_player(currenttrackid)
                if musictype=='Deezer':
                    self.deezer_player(currenttrackid)

    def change_media_previous(self):
        if os.path.isfile("{}/.player.json".format(USER_PATH)):
            with open('{}/.player.json'.format(USER_PATH),'r') as input_file:
                  playerinfo= json.load(input_file)
            currenttrackid=playerinfo[0]
            loopstatus=playerinfo[2]
            numtracks=playerinfo[1]
            musictype=playerinfo[3]
            nexttrackid=currenttrackid-1
            prevtrackid=currenttrackid-2
            if prevtrackid<0:
                currenttrackid=0
            else:
                currenttrackid=prevtrackid
            playerinfo=[nexttrackid,numtracks,loopstatus,musictype]
            with open('{}/.player.json'.format(USER_PATH), 'w') as output_file:
                json.dump(playerinfo, output_file)
            if currenttrackid<numtracks:
                if musictype=='Google Music':
                    self.googlemusic_player(currenttrackid)
                if musictype=='YouTube':
                    self.youtube_player(currenttrackid)
                if musictype=='Spotify':
                    self.spotify_player(currenttrackid)
                if musictype=='Gaana':
                    self.gaana_player(currenttrackid)
                if musictype=='Deezer':
                    self.deezer_player(currenttrackid)

    def media_player(self,mrl):
        self.libvlc_player = self.libvlc_Instance.media_player_new()
        media=self.libvlc_Instance.media_new(mrl)
        self.libvlc_player.set_media(media)
        self.libvlc_player.play()
        if os.path.isfile("{}/.mediavolume.json".format(USER_PATH)):
            with open('{}/.mediavolume.json'.format(USER_PATH), 'r') as vol:
                setvollevel = json.load(vol)
            self.set_vlc_volume(int(setvollevel))
        else:
            self.set_vlc_volume(90)
        event_manager = self.libvlc_player.event_manager()
        event_manager.event_attach(vlc.EventType.MediaPlayerEndReached,self.end_callback)
        #self.libvlc_Media_list.add_media(media)
        #self.libvlc_list_player.play_item(media)

    def set_vlc_volume(self,level):
        self.libvlc_player.audio_set_volume(level)

    def get_vlc_volume(self):
        return self.libvlc_player.audio_get_volume()

    def mute_vlc(self,status=True):
        return self.libvlc_player.audio_set_mute(status)

    def stop_vlc(self):
        print('stopping vlc')
        self.libvlc_player.stop()

    def pause_vlc(self):
        print('pausing vlc')
        self.libvlc_player.pause()

    def play_vlc(self):
        if self.libvlc_player.get_state()==vlc.State.Paused:
            print('playing/resuming vlc')
            self.libvlc_player.play()

    def is_vlc_playing(self):
        return self.libvlc_player.is_playing()

    def state(self):
        return self.libvlc_player.get_state()

    def media_manager(self,tracks,type):
        self.check_delete("{}/.player.json".format(USER_PATH))
        self.check_delete("{}/.trackqueue.json".format(USER_PATH))
        with open('{}/.trackqueue.json'.format(USER_PATH), 'w') as output_file:
            json.dump(tracks, output_file)
        currenttrackid=0
        nexttrackid=currenttrackid+1
        loopstatus='on'
        musictype=type
        numtracks=len(tracks)
        playerinfo=[nexttrackid,numtracks,loopstatus,musictype]
        with open('{}/.player.json'.format(USER_PATH), 'w') as output_file:
            json.dump(playerinfo, output_file)

    def googlemusic_player(self,trackid):
        with open('{}/.trackqueue.json'.format(USER_PATH),'r') as input_file:
            tracks= json.load(input_file)
        streamurl=api.get_stream_url(tracks[trackid])
        self.media_player(streamurl)

    def youtube_player(self,trackid):
        with open('{}/.trackqueue.json'.format(USER_PATH),'r') as input_file:
            tracks= json.load(input_file)
        print(tracks[trackid])
        self.media_player(tracks[trackid])

    def spotify_player(self,trackid):
        with open('{}/.trackqueue.json'.format(USER_PATH),'r') as input_file:
            tracks= json.load(input_file)
        print(tracks[trackid])
        urlid = youtube_search(tracks[trackid])
        if urlid is not None:
            fullurl = "https://www.youtube.com/watch?v=" + urlid
            audiostream, videostream = youtube_stream_link(fullurl)
            streamurl = audiostream
            self.media_player(streamurl)

    def gaana_player(self,trackid):
        with open('{}/.trackqueue.json'.format(USER_PATH),'r') as input_file:
            tracks= json.load(input_file)
        print(tracks[trackid])
        urlid = youtube_search(tracks[trackid])
        if urlid is not None:
            fullurl = "https://www.youtube.com/watch?v=" + urlid
            audiostream, videostream = youtube_stream_link(fullurl)
            streamurl = audiostream
            self.media_player(streamurl)

    def deezer_player(self,trackid):
        with open('{}/.trackqueue.json'.format(USER_PATH),'r') as input_file:
            tracks= json.load(input_file)
        print(tracks[trackid])
        urlid = youtube_search(tracks[trackid])
        if urlid is not None:
            fullurl = "https://www.youtube.com/watch?v=" + urlid
            audiostream, videostream = youtube_stream_link(fullurl)
            streamurl = audiostream
            self.media_player(streamurl)

    def check_delete(self,file):
        if os.path.isfile(file):
            os.system("sudo rm "+file)