import os
import json
import requests
import time
from datetime import datetime
from secrets import spotify_user_id, rotation_id
from refresh import Refresh

# Original concept, API format and code fixes, courtesy of Euan Morgan.
# Ideas spawned by YouTube video https://www.youtube.com/watch?v=jzH3n5GvmoA
# NOTE: Where display shows track was 'Last Played', assume track was manually added OR updated via BOTIFY app.

temp = "xxx"
flag = 0
os.system('cls')
print("[•_•] BOTIFY - A playlist manager for a big playlist.")
print("Euan Fix Plus Flag Edition: 08-JAN-2021 @ 18:35 (c) Viking Design.")
print("User: " + spotify_user_id)
refreshCaller = Refresh() # NOTE: Euan 2nd Fix

class RunBotify:
    def __init__(self):
        self.user_id = spotify_user_id
        self.rot_playlist_id = rotation_id
        self.spotify_token = ""
        self.nowtrack = ""
        self.newtrack = ""
        self.artist = ""
        self.title = ""

    def get_now_playing_track(self):
        global temp, flag
        query = "https://api.spotify.com/v1/me/player/currently-playing"
        response = requests.request("get", url=query, headers={"Content-type": "application/json","Authorization": "Bearer {}".format(self.spotify_token)})
        
        if response.status_code == 204:
            if flag == 0:
                print("NOTHING PLAYING")
                print("(Further updates when play resumes)")
                temp = "xxx"
                flag = 1
            time.sleep(20)
            self.call_refresh()
            return

        flag = 0
        json_data = json.loads(response.text)
        self.nowtrack = json_data["item"]["uri"]
        self.artist = json_data["item"]["album"]["artists"][0]["name"]
        self.title = json_data["item"]["name"]
                               
        if temp != self.nowtrack:
            prevtrack = temp
            temp = self.nowtrack 
            now = datetime.now()    
            date_time = now.strftime("%d/%m/%Y - %H:%M:%S")
            print("------------------------------------------------------------") 
            print(date_time)
            print("[•] " + self.artist + " - " + self.title)
            self.call_refresh()
            self.nowtrack = prevtrack
            self.played_track_manager()

    def played_track_manager(self):
        if self.nowtrack != "xxx":
            self.remove_track_from_rotation()
            self.get_rotation_track()
            self.add_track_to_rotation()

        while True:
            time.sleep(3)
            self.get_now_playing_track()

    def get_rotation_track(self):
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.rot_playlist_id)
        response = requests.request("get", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}, params={"limit":1})
        response_json = response.json()
        self.newtrack = response_json["items"][len(response_json["items"]) - 1]
     
        added = response_json["items"][0]["added_at"]
        day = added[8:10]
        mon = added[5:7]
        yer = added[0:4]
        our = added[11:13]
        min = added[14:16]
        sec = added[17:19]

        last_played = day + "/" + mon + "/" + yer + " @ " + our + ":" + min + ":" + sec
        last_played_date = day + "/" + mon + "/" + yer
        now = datetime.now()    
        todays_date = now.strftime("%d/%m/%Y") 

        d1 = last_played_date
        d2 = todays_date
        d1 = datetime.strptime(d1, "%d/%m/%Y")
        d2 = datetime.strptime(d2, "%d/%m/%Y")
        dx = abs((d2 - d1).days)
        print("[#] Last played (added) " + last_played + " ("  + str(dx) + " days ago)")

    def remove_track_from_rotation(self):
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.rot_playlist_id)  
        response = requests.request("delete", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)}, data=json.dumps({"tracks": [{"uri": self.nowtrack}]}))

    def add_track_to_rotation(self):
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.rot_playlist_id, self.nowtrack)
        response = requests.request("post", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)})

    #def call_refresh(self):                            # NOTE Old Style Refresh
    #    refreshCaller = Refresh()                      # NOTE Old Style Refresh
    #    self.spotify_token = refreshCaller.refresh()   # NOTE Old Style Refresh


    def call_refresh(self): #NOTE Euans 2nd Fix
        #UPDATES ADDED HERE
        #1.) Use the single global instance of refresh class
        #instead of making a new one each time
        #2.) Check for -1 returned from refresh class.
        #If received, try again every 30 seconds until sucessful
        global refreshCaller
        while True:
            self.spotify_token = refreshCaller.refresh()
            if self.spotify_token == -1:
                print("===================\n\n\n\n\n[!] Error refreshing token, retrying in 30 Seconds\n\n\n\n\n=============================")
                time.sleep(30)
            else:
                break

        
a = RunBotify()
a.call_refresh()
a.played_track_manager()
