import os, json, requests, time, sqlite3
from sqlite3 import Error
from secrets import spotify_user_id
from refresh import Refresh
from alive_progress import alive_bar

refreshCaller = Refresh()
job_done = False

os.system('cls')
print("[•_•] Rebuilder - Playlist Rebuilder.")
print("Original Version 1.4.0: 13-MAR-2021 @ 16:17 (c) Viking Design.(^o.o^)")
print("RE-vamp 01-OCT-2022 @ 15:28 by Beak Builds of Peck-Ham")
print("Rebuild a playlist from a SQLite Database")
print("User: " + spotify_user_id)

class PlaylistReBuild:
    def __init__(self):
        #---------------------------------------------------------------------------
        #INSERT PLAYLIST NAME HERE FROM DATABASE (MUST BE EXACT) FILE BETWEEN QUOTES
        self.database_name = "Endless Feed"
        #---------------------------------------------------------------------------
        self.user_id = spotify_user_id
        self.rebuilt_playlist_id = ""
        self.spotify_token = ""
        self.here_i_am = os.path.dirname(os.path.abspath(__file__))
        
    def rebuild_the_playlist(self):
        tic = time.perf_counter()
        while True:
            if os.path.exists(self.here_i_am + r"\\" + self.database_name + ".db") == False:
                print(f"Database {self.database_name} Does Not Exist !!!")
                exit()
            self.create_playlist()
            self.rebuild_database()
            if job_done:
                toc = time.perf_counter()
                ty_res = time.gmtime(toc - tic)
                res = time.strftime("%H Hours :%M Minutes :%S Seconds",ty_res)
                print()
                print(f"Playlist Rebuild Took {res} Seconds To Complete" )
                print()
                return

    def create_playlist(self):
        query = "https://api.spotify.com/v1/users/{}/playlists".format(self.user_id)
        request_body = json.dumps({"name": self.database_name + " - Rebuilt", "description": "Rebuilt Playlist from " + self.database_name + " Database", "public": True})
        response = requests.post(query, data=request_body, headers={"Content-Type": "application/json","Authorization": "Bearer {}".format(self.spotify_token)})
        response_json = response.json()
        self.rebuilt_playlist_id = response_json["id"]
        return 

    def rebuild_database(self):
        global database, conn        
        database = self.here_i_am + r"\\" + self.database_name + ".db"
        conn = self.create_connection(database)
        if conn is not None:
            self.select_all_rows(conn)
        else:
            print("Error! cannot create the database connection.")
                     
    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 select_all_rows(self, conn):  
        global job_done  
        cur = conn.cursor()
        try:
            cur.execute("SELECT COUNT (*) FROM Track_List")
            self.total_records = int(cur.fetchone()[0])
            cur.execute("SELECT URI FROM Track_list")
        except:
            print("No Tracks In Source Playlist......")
            return
        rows = cur.fetchall()
        i = 0
        while i < self.total_records:
            with alive_bar(self.total_records, title="Restoring Database Tracks to Playlist") as bar:
                for row in rows:
                    newtrack = (str(row[0]))
                    self.add_track_to_playlist(newtrack)
                    i += 1
                    bar()
        job_done = True
        return

    def add_track_to_playlist(self, newtrack):
        query = "https://api.spotify.com/v1/playlists/{}/tracks?uris={}".format(self.rebuilt_playlist_id, newtrack)
        response = requests.request("post", url=query, headers={"Content-type": "application/json","Authorization":"Bearer {}".format(self.spotify_token)})

    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.rebuild_the_playlist()