import os
import json
import requests
import time
import sqlite3
from sqlite3 import Error
from secrets import spotify_user_id
from refresh import Refresh

refreshCaller = Refresh()
job_done = False

os.system('cls')
print("[•_•] Rebuilder - Playlist Rebuilder.")
print("Version 1.4.0: 13-MAR-2021 @ 16:17 (c) Viking Design.(^o.o^)")
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 = "plusothers"
        #---------------------------------------------------------------------------
               
        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 do_the_business(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.check_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(f"Shuffle Took {res} Seconds To Complete" )
                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 check_database(self):                             # NOTE: Create Database and Table If Not Exist
        global database, conn        
        database = self.here_i_am + r"\\" + self.database_name + ".db"
        sql_create_tracks_table = """ CREATE TABLE IF NOT EXISTS No_Match (URI text PRIMARY KEY, TRACK_NAME text, ARTIST_NAME text, FROM_TABLE text); """
        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 * FROM No_Match")
        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)
        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.do_the_business()