#!/usr/bin/env python3
from deemix.app.queuemanager import addToQueue, removeFromQueue, getQueue, cancelAllDownloads, removeFinishedDownloads, restoreQueue, slimQueueItems, resetQueueItems
from deemix.utils.misc import getTypeFromLink, getIDFromLink
from deemix.app.settings import initSettings, getSettings, getDefaultSettings, saveSettings
from deemix.app.spotify import SpotifyHelper
from deemix.utils.localpaths import getConfigFolder

import os.path as path
import json
from os import remove

settings = {}
spotifyHelper = None
chartsList = []
configFolder = ""


def initialize(portable):
    global settings
    global spotifyHelper
    global defaultSettings
    global configFolder
    if portable:
        configFolder = portable
    else:
        configFolder = getConfigFolder()
    settings = initSettings(configFolder=configFolder)
    defaultSettings = getDefaultSettings()
    spotifyHelper = SpotifyHelper(configFolder=configFolder)


def shutdown(interface=None):
    global configFolder
    if settings['saveDownloadQueue']:
        (queue, queueComplete, queueList, currentItem) = getQueue()
        if len(queueList) > 0:
            if currentItem != "":
                queue.insert(0, currentItem)
            with open(path.join(configFolder, 'queue.json'), 'w') as f:
                json.dump({
                    'queue': queue,
                    'queueComplete': queueComplete,
                    'queueList': resetQueueItems(queueList, queue)
                }, f)
    cancelAllDownloads(interface)
    if interface:
        interface.send("toast", {'msg': "Server is closed."})

def loadDownloadQueue(dz, interface=None):
    global configFolder
    if path.isfile(path.join(configFolder, 'queue.json')):
        if interface:
            interface.send('toast', {'msg': "Restoring download queue", 'icon': 'loading', 'dismiss': False,
                                     'id': 'restoring_queue'})
        with open(path.join(configFolder, 'queue.json'), 'r') as f:
            qd = json.load(f)
        if interface:
            interface.send('init_downloadQueue',
                 {'queue': qd['queue'], 'queueComplete': qd['queueComplete'], 'queueList': slimQueueItems(qd['queueList'])})
        if interface:
            interface.send('toast', {'msg': "Download queue restored!", 'icon': 'done', 'dismiss': True,
                                     'id': 'restoring_queue'})
        remove(path.join(configFolder, 'queue.json'))
        restoreQueue(qd['queue'], qd['queueComplete'], qd['queueList'], dz, interface)

def getDownloadFolder():
    global settings
    return settings['downloadLocation']

def get_charts(dz):
    global chartsList
    if len(chartsList) == 0:
        temp = dz.get_charts_countries()
        countries = []
        for i in range(len(temp)):
            countries.append({
                'title': temp[i]['title'].replace("Top ", ""),
                'id': temp[i]['id'],
                'picture_small': temp[i]['picture_small'],
                'picture_medium': temp[i]['picture_medium'],
                'picture_big': temp[i]['picture_big']
            })
        chartsList = countries
    return chartsList

def getUserFavorites(dz):
    user_id = dz.user['id']
    result = {}
    try:
        result['playlists'] = dz.get_user_playlists(user_id)['data']
        result['albums'] = dz.get_user_albums(user_id)['data']
        result['artists'] = dz.get_user_artists(user_id)['data']
        result['tracks'] = dz.get_user_tracks(user_id)['data']
    except:
        result['playlists'] = dz.get_user_playlists_gw(user_id)
        result['albums'] = dz.get_user_albums_gw(user_id)
        result['artists'] = dz.get_user_artists_gw(user_id)
        result['tracks'] = dz.get_user_tracks_gw(user_id)
    return result

def updateUserSpotifyPlaylists(user):
    if user == "" or not spotifyHelper.spotifyEnabled:
        return []
    return spotifyHelper.get_user_playlists(user)


def updateUserPlaylists(dz):
    user_id = dz.user['id']
    try:
        return dz.get_user_playlists(user_id)['data']
    except:
        return dz.get_user_playlists_gw(user_id)

def updateUserAlbums(dz):
    user_id = dz.user['id']
    try:
        return dz.get_user_albums(user_id)['data']
    except:
        return dz.get_user_albums_gw(user_id)

def updateUserArtists(dz):
    user_id = dz.user['id']
    try:
        return dz.get_user_artists(user_id)['data']
    except:
        return dz.get_user_artists_gw(user_id)

def updateUserTracks(dz):
    user_id = dz.user['id']
    try:
        return dz.get_user_tracks(user_id)['data']
    except:
        return dz.get_user_tracks_gw(user_id)

def getSpotifyPlaylistTracklist(id):
    if id == "" or not spotifyHelper.spotifyEnabled:
        return spotifyHelper.emptyPlaylist
    return spotifyHelper.get_playlist_tracklist(id)

# Search functions
def mainSearch(dz, term):
    return dz.search_main_gw(term)


def search(dz, term, type, start, nb):
    return dz.search(term, type, nb, start)


# Queue functions
def addToQueue_link(dz, url, bitrate=None, interface=None):
    return addToQueue(dz, spotifyHelper, url, settings, bitrate, interface)


def removeFromQueue_link(uuid, interface=None):
    removeFromQueue(uuid, interface)


def cancelAllDownloads_link(interface=None):
    cancelAllDownloads(interface)


def removeFinishedDownloads_link(interface=None):
    removeFinishedDownloads(interface)


def initDownloadQueue():
    (queue, queueComplete, queueList, currentItem) = getQueue()
    return (queue, queueComplete, slimQueueItems(queueList), currentItem)

def analyzeLink(dz, link):
    type = getTypeFromLink(link)
    relID = getIDFromLink(link, type)
    if type in ["track", "album"]:
        data = getattr(dz, 'get_' + type)(relID)
    else:
        data = {}
    return (type, data)

# Settings functions
def getDefaultSettings_link():
    return defaultSettings


def getSettings_link():
    return getSettings()


def saveSettings_link(newSettings):
    global settings
    settings = newSettings
    return saveSettings(newSettings)


def getSpotifyCredentials():
    return spotifyHelper.getCredentials()


def setSpotifyCredentials(newCredentials):
    return spotifyHelper.setCredentials(newCredentials)