import os, sys, datetime
import json
import requests
import time
import sqlite3
from sqlite3 import Error
sys.path.insert(1, 'j:\\HGMS')
from refresh import Refresh

refreshCaller = Refresh()
job_done = False

print("[•_•] Updating Review Playlist.")
print()

class PlaylistReBuild:
    def __init__(self):
        #---------------------------------------------------------------------------
        #INSERT PLAYLIST NAME HERE FROM DATABASE (MUST BE EXACT) FILE BETWEEN QUOTES
        self.boom_database_name = "Boom Tracks Database"
        #---------------------------------------------------------------------------
        #self.boom_path = "C:\\Users\AlSmi\Dropbox\MUSIC-TIN\BOOM-Sorter"
        self.user_list = []
        self.playlist_list = []
        self.pluser_id1 = 'Ollie'
        self.pluser_id2 = 'Freddie'
        self.user = 0
        self.playlist_id1 = '7MDdo6na9BPIMMJRguIRpc'
        self.playlist_id2 = '6x7ug6iqQG6zuH39GpwaFA'
        self.spotify_token = ""
        self.here_i_am = os.path.dirname(os.path.abspath(__file__))
        
    def do_the_business(self):
        self.boom_database = self.here_i_am + r"\\" + self.boom_database_name + ".db"
        #self.boom_database = self.boom_path + r"\\" + self.boom_database_name + ".db"
        self.user_list.extend([self.pluser_id1, self.pluser_id2])
        self.playlist_list.extend([self.playlist_id1, self.playlist_id2])
        while self.user < 2:
            print("Working on User " + self.user_list[self.user] + " Tracks to Review")
            print("Could Take A While......")
            self.call_refresh()
            self.clear_playlist()
            self.read_database()
            self.get_track_count_from_playlist()
            self.update_playlist_info()
            self.user+=1
        return

    def clear_playlist(self):
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.playlist_list[self.user], "spotify:track:3lpDrxUkr0tIe1kmJvdK7d")
        response = requests.request("put", url=query, headers={"Content-type": "application/json", "Authorization": "Bearer {}".format(self.spotify_token)})
        query = "https://api.spotify.com/v1/playlists/{}/tracks".format(self.playlist_list[self.user])
        response = requests.request("delete", url=query, headers={"Content-type": "application/json", "Authorization": "Bearer {}".format(self.spotify_token)}, data=json.dumps({"tracks": [{"uri": "spotify:track:3lpDrxUkr0tIe1kmJvdK7d"}]}))
        return
                     
    def create_connection(self, db_file):           # NOTE: Create ConnectionTo Database
        conn = None
        try:
            conn = sqlite3.connect(db_file)
            return conn
        except Error as e:
            print(e)
        return conn

    def read_database(self):  
        conn = self.create_connection(self.boom_database)
        cur = conn.cursor()
        try:
            cur.execute("SELECT * FROM " + self.user_list[self.user] + "_To_Review")
        except:
            print("No Tracks In Source Playlist......")
            return
        rows = cur.fetchall()

        for row in rows:
            newtrack = (str(row[0]))
            self.add_track_to_playlist(newtrack)
        return

    def add_track_to_playlist(self, newtrack):
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.playlist_list[self.user], newtrack)
        response = requests.request("post", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)})
        return

    def update_playlist_info(self):
        now = datetime.datetime.now()
        plname = self.playlist_name
        pldesc = self.total
        query = "https://api.spotify.com/v1/playlists/{}".format(self.playlist_list[self.user])
        request_body = json.dumps({"name": "" + str(plname) + "", "description": "LAST UPDATED: " +
                                   now.strftime("%d-%m-%Y %H:%M:%S") + " --- " + str(pldesc) + " Tracks to be reviewed", "public": True})
        response = requests.put(query, data=request_body, headers={
                                    "Content-Type": "application/json", "Authorization": "Bearer {}".format(self.spotify_token)})
        return
    
    def get_track_count_from_playlist(self):
        query = "https://api.spotify.com/v1/playlists/{}".format(self.playlist_list[self.user])
        response = requests.request("get", url=query, headers={"Content-type": "application/json", "Authorization": "Bearer {}".format(self.spotify_token)})
        json_data = json.loads(response.text)
        self.playlist_name = (json_data["name"])
        self.total = (json_data["tracks"]["total"])
        return

    def hoover(self):
        conn = self.create_connection(self.boom_database)
        cur = conn.cursor()
        cur.execute("VACUUM")
        conn.commit()
    
    def call_refresh(self): #NOTE Euans 2nd Fix
        global refreshCaller
        while True:
            self.spotify_token = refreshCaller.refresh()
            if self.spotify_token == -1:
                print("==============================\n[!] Error refreshing token, retrying in 30 Seconds\n==============================")
                time.sleep(30)
            else:
                break
        
a = PlaylistReBuild()
a.call_refresh()
a.do_the_business()