import json
import requests
import time
from datetime import datetime
from secrets import spotify_user_id
from secrets import queue_id
from secrets import rotation_id
from secrets import non_queue_id
from refresh import Refresh

precheck = 0
temp = "xxx"
queue_max =  5 # NOTE: <== Your preffered QUEUE size.
queue_count = 0
queue_dif = 0

print(" ")
print("[•_•] BOTIFY maintains a QUEUE playlist, fed by the")
print("Least Recently Played tracks from a CYCLIC playlist.")
print("Birthday Edition 08-Jan-21 @ 20:08 (c) Viking Designs.")
print("Current User: " + spotify_user_id)
print(" ")

class RunBotify:
    def __init__(self):
        self.user_id = spotify_user_id
        self.spotify_token = ""
        self.nowtrack = ""
        self.newtracks = ""
        self.quetracks = ""
        self.nontrack = ""
        self.que_playlist_id = queue_id
        self.rot_playlist_id = rotation_id
        self.non_que_playlist_id = non_queue_id
        self.get_artist = ""
        self.get_album = ""
        self.get_year = ""
        self.quetrack = ""
        self.newtune = False

    def get_now_playing_track(self):
        ##print("40 get now playing track ")
        global precheck, queuetrack, displaydata, inqueue
        if precheck == 0:
            displaydata = False
            precheck = 1
            self.get_track_total_from_queue()

        query = "https://api.spotify.com/v1/me/player/currently-playing"
        headers={"Content-type": "application/json","Authorization": "Bearer {}".format(self.spotify_token)}
        response = requests.request("get", url=query, headers=headers)

        if response.status_code == 204:
            print("No Track Playing! - [Re-check in 60 seconds]")
            time.sleep(60)
            print("[0] Refresh Access Token.")
            self.call_refresh()
            query = "https://api.spotify.com/v1/me/player/currently-playing"
            headers={"Content-type": "application/json","Authorization": "Bearer {}".format(self.spotify_token)}
            response = requests.request("get", url=query, headers=headers)
#------------------------------------------------------------------------------------------------------------------------------------





        json_data = json.loads(response.text)
        self.nowtrack = json_data["item"]["uri"]
        ##print("60  " + json_data["item"]["name"])
    
        self.check_queue_track()

        self.get_artist = json_data["item"]["album"]["artists"][0]["name"]
        self.get_album =  json_data["item"]["album"]["name"]
        self.get_year = json_data["item"]["album"]["release_date"][:4]
        now = datetime.now()    
        date_time = now.strftime("%d/%m/%y at %H:%M:%S")

        if not displaydata:
            print("--------------------------------------------------------") 
            print(date_time)
            print("Track    " + json_data["item"]["name"] + ".")
            print("Artist   " + self.get_artist + ".")
            print("Album    " + self.get_album + ".")
            print("Release  " + self.get_year + ".")
            
            displaydata = True 
            self.call_refresh()        

        if self.quetrack == self.nowtrack:
            if queuetrack:
                inqueue = True
            else: 
                inqueue = False
                displaydata = False
        else:
            self.played_track_manager(json_data, inqueue)
            displaydata = False

        while True:
            time.sleep(12)
            print("here")
            self.get_now_playing_track()


###        global temp                              
###        if temp != self.nowtrack:
###            print("71 self.nowtrack : " + json_data["item"]["name"])
###            prevtrack = temp
###            ####self.check_queue_track()
###            temp = self.nowtrack 
###            now = datetime.now()    
###            date_time = now.strftime("%d/%m/%y at %H:%M:%S")
###            print("--------------------------------------------------------") 
###            print(date_time)
###            print("Track    " + json_data["item"]["name"] + ".")
###            print("Artist   " + self.get_artist + ".")
###            print("Album    " + self.get_album + ".")
###            print("Release  " + self.get_year + ".")
             
###            self.call_refresh()
###            ###print("[1] Refresh Access Token.")
###            self.check_queue_track()
###            self.nowtrack = prevtrack 
###            self.played_track_manager(json_data)





#------------------------------------------------------------------------------------------------------------------------------------------------
    def played_track_manager(self, json_data, inqueue):
        print("90 played track manager")
###        if self.nowtrack != "xxx":
###            print("92  " + json_data["item"]["name"])
###            print(queuetrack)
            
        if inqueue:
            self.remove_track_from_queue()
            self.remove_track_from_rotation()
            self.add_track_to_rotation()
        else:
            self.add_to_non_queue()

        self.newtune = False

        self.get_track_total_from_queue()
        print("104--------------")
        print(queuetrack)

        #while True:
        #    time.sleep(12)
        #    self.get_now_playing_track()

    def remove_track_from_queue(self):
        print("112 [2] Remove  PREVIOUS track from QUEUE.")
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.que_playlist_id)
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}     
        params = {"tracks": [{"uri": self.nowtrack}]}
        response = requests.request("delete", url=query, headers=headers, data=json.dumps(params))

    def remove_track_from_rotation(self):
        print("119 [3] Remove  PREVIOUS track from start of RECYCLE.")
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.rot_playlist_id)
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}     
        params = {"tracks": [{"uri": self.nowtrack}]}
        response = requests.request("delete", url=query, headers=headers, data=json.dumps(params))

    def add_track_to_rotation(self):
        print("126 [4] Replace PREVIOUS track to the end of RECYCLE.")
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.rot_playlist_id, self.nowtrack)
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}
        response = requests.request("post", url=query, headers=headers)

    def get_track_total_from_queue(self):
        print("132 get track total from queue")
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.que_playlist_id)
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}
        response = requests.request("get", url=query, headers=headers)
        response_json = response.json()
        
        queue_tot = 0
        for i in response_json["items"]:
            queue_tot =  queue_tot + 1

        print("142 [=] Current total '" + str(queue_tot) + "' tracks in the QUEUE.")
        if queue_tot < queue_max:
            self.get_rotation_tracks(queue_tot)

    def get_rotation_tracks(self, queue_tot):
        global queue_count, queue_dif
        # NOTE: QUEUE DIFF is the difference between the QUEUE MAX and current QUEUE TOTAL.
        queue_count = queue_max
        queue_dif = queue_count - queue_tot
        print("151 [<] Getting '" + str(queue_dif) + "' fresh tracks from RECYCLE.")
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.rot_playlist_id)
        params={"limit":queue_count}
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}
        response = requests.request("get", url=query, headers=headers, params=params)
        response_json = response.json()

        self.newtracks = ""
        for i in response_json["items"]:
            self.newtracks += i["track"]["uri"] + ","
        
        # NOTE: The variable 'add_pos' is the position in the 'newtracks' data where the
        # NOTE: 'addition' point should start, thus skipping those tracks already in QUEUE.
        add_pos = (queue_dif * 37) # NOTE: 37 bits of data per track URI.
        self.newtracks = self.newtracks[-(add_pos):-1]
        self.add_to_queue()

    def add_to_queue(self):
        global queue_dif
        print("170 [+] Adding  '" + str(queue_dif) + "' fresh tracks to the QUEUE.")
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.que_playlist_id,self.newtracks)
        headers={"Content-type": "application/json","Authorization": "Bearer {}".format(self.spotify_token)}
        # NOTE: Keep 'POST' (append) as 'PUT' (replace) removes any remaining tracks from QUEUE.
        response = requests.request("post", url=query, headers=headers)

    def check_queue_track(self):
        global queuetrack
        queuetrack = False
        print ("179  check queue track")
        #print(queuetrack)
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.que_playlist_id)
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}
        response = requests.request("get", url=query, headers=headers)
        response_json = response.json()

        for i in response_json["items"]:
            self.quetracks += (i["track"]["uri"] + ",")

            if not self.newtune:
                self.quetrack = self.nowtrack
                self.newtune = True

            print("que  " + self.quetrack)
            print("now  " + self.nowtrack)

            if self.nowtrack == (i["track"]["uri"]):
                queuetrack = True
                print(self.nontrack)
                print("192-------")
                print(queuetrack)
                return
            else:
                queuetrack = False
                print(self.nontrack)
                print("199-------")
                print(queuetrack)


    def add_to_non_queue(self):
        print("204 [5] Adding Track to Fred & Ollies non-QUEUE toons playlist.")
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.non_que_playlist_id, self.nontrack)
        headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}
        response = requests.request("post", url=query, headers=headers)



    def call_refresh(self):
        refreshCaller = Refresh()
        self.spotify_token = refreshCaller.refresh()
        self.get_now_playing_track()

a = RunBotify()
a.call_refresh()
 