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 =  10 # NOTE: <== Your preffered QUEUE size.
queue_count = 0
queue_dif = 0
flag = 0
check_if_track_in_queue = False

print(" ")
print("[•_•] BOTIFY maintains a QUEUE playlist, fed by the")
print("Least Recently Played tracks from a CYCLIC playlist.")
print("Now incorperating NON-QUEUE handling")
print("Morbid Obesity Edition 01-Feb-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 = ""

    def get_now_playing_track(self):
        global precheck, queue_track, flag
        if precheck == 0:
            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:
            if flag == 0:
                print("NOTHING PLAYING")
                flag = 1
            time.sleep(6)
            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)

        flag = 0
        json_data = json.loads(response.text)
        self.nowtrack = json_data["item"]["uri"]
        if not check_if_track_in_queue:
            self.is_track_in_queue()
        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]

        global temp                              
        if temp != self.nowtrack:
            prevtrack = temp
            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.nowtrack = prevtrack 
            self.played_track_manager(json_data)

    def played_track_manager(self, json_data):
        global check_if_track_in_queue
        if self.nowtrack != "xxx":
            
            if queue_track:
                self.remove_track_from_queue()
                self.remove_track_from_rotation()
                self.add_track_to_rotation()
            if not queue_track:
                self.add_to_non_queue()

            self.get_track_total_from_queue()
            check_if_track_in_queue = False

        while True:
            time.sleep(3)
            self.get_now_playing_track()

    def remove_track_from_queue(self):
        print("[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("[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("[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):
        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("[=] 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("[<] 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("[+] 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 is_track_in_queue(self):
        global queue_track, check_if_track_in_queue
        queue_track = False
        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()
        check_if_track_in_queue = True

        for i in response_json["items"]:
            self.quetracks += (i["track"]["uri"] + ",")
            
            if self.nowtrack == (i["track"]["uri"]):
                queue_track = True
                return
            else:
                self.nontrack = self.nowtrack
                queue_track = False

    def add_to_non_queue(self):
        print("[5] Adding PREVIOUS 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()
 