import os
import json
import requests
import time
import shuffle
from secrets import spotify_user_id, feed_id, queue_id
from refresh import Refresh

'''
Original concept, API format and code fixes, courtesy of Euan Morgan. https://euanmorgan.github.io
Ideas spawned by YouTube video https://www.youtube.com/watch?v=jzH3n5GvmoA
See 'about-main.py' and 'about-shuffle.py' for more details.
'''

os.system('cls')
print("[•_•] BOTIFY - QUEUE & FEED PLAYLIST MANAGER.")
print("New Edition: 19-FEB-2021 @ 18:00 (c) Viking Design.")
print("User: " + spotify_user_id)
refreshCaller = Refresh()

class RunBotify:
    def __init__(self):
        self.user_id = spotify_user_id
        self.que_playlist_id = queue_id
        self.fed_playlist_id = feed_id
        self.spotify_token = ""
        self.tracks = ""

    def get_tracks_from_feed(self):
        # NOTE: (1) Set number of tracks to get from FEED to populate your play QUEUE playlist.
        queue_max = 5
        if queue_max == 0:
            queue_max = 1
        if queue_max > 100:
            queue_max = 100
        params={"limit":queue_max}
        print("[•] Get '" + str(queue_max) + "' tracks from FEED playlist...")
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.fed_playlist_id)
        response = requests.request("get", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)},params=params)
        response_json = response.json()

        for i in response_json["items"]:
            self.tracks += i["track"]["uri"] + ","
            print(i["track"]["name"])
        self.tracks = self.tracks[:-1]
        self.add_track_to_queue()
   
    def add_track_to_queue(self):
        # NOTE: (2) POST appends (adds to) and PUT replaces (removes) amy tracks in QUEUE.
        print("[•] Copying the FEED tracks to QUEUE...")
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.que_playlist_id, self.tracks)
        response = requests.request("post", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)})
        self.remove_tracks_from_feed()

    def remove_tracks_from_feed(self):
        print("[•] Removing tracks from the FEED playlist...")
        # print(">> URL's to DELETE: " + self.tracks)

        tracks_to_delete = []
        tmp_tracks = self.tracks.split(",")
        for i in tmp_tracks:
            tracks_to_delete.append({"uri":i})
        # print({"tracks": tracks_to_delete})

        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.fed_playlist_id)
        response = requests.request("delete", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}, data=json.dumps({"tracks": tracks_to_delete}))
        print("[•] All done!")

    def call_refresh(self):
        print("[•] Refreshing Token....")
        global refreshCaller
        while True:
            self.spotify_token = refreshCaller.refresh()
            if self.spotify_token == -1:
                print("[X] Error Refreshing Token - Retrying in 30 Secs [X]")
                time.sleep(30)
            else:
                break

a = RunBotify()
a.call_refresh()
a.get_tracks_from_feed()
