from datetime import datetime
import sys, json, requests, time, sqlite3
sys.path.insert(1, 'j:\\Spotty\secrets_and_database')
from alive_progress import alive_bar
from sqlite3 import Error
from refresh import Refresh

refreshCaller = Refresh()
job_done = False

class genre2:
    def __init__(self):
        self.spotify_token = ""
        self.dbpath = 'j:\\Spotty\secrets_and_database'
        #self.database_name = "Enormous Feed"
        self.database_name = "Endless Feed2"
        self.artist_list = []
        self.artist_track_list = []

    def call_refresh(self):         # NOTE  Euan's Mk.2
        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

    def do_the_business(self):
        self.database = self.dbpath + r"\\" + self.database_name + ".db"
        self.add_artist_records_to_list()
        print()
        self.add_artist_track_uri_to_list()
        print()
        self.get_artist_data()

    def create_connection(self, db_file):  # NOTE Create a database connection
        conn = None
        try:
            conn = sqlite3.connect(db_file)
            return conn
        except Error as e1:
            print("Create_Connection")
            print(e1)
        return conn
            
    def add_artist_records_to_list(self):
        self.item = 0
        conn = self.create_connection(self.database)
        cur = conn.cursor()
        try:
            with conn:
                cur.execute("SELECT * FROM Artist_Genre WHERE ARTIST_URI = 0 ORDER BY ARTIST_NAME ASC")
                rows = cur.fetchall()
                self.trw = len(rows)
                rw = 1
                for row in rows:
                    print("Adding Artists To List! Working on Item " + str(rw) + " of " + str(self.trw), end='\r')
                    self.artist_list.append(row[0])
                    rw+=1
                    continue
        except Error as e2:
            print("add_artist_records_to_list")
            print(e2)
        return

    def add_artist_track_uri_to_list(self):
        self.item = 0
        conn = self.create_connection(self.database)
        cur = conn.cursor()
        try:
            with conn:
                while self.item < self.trw:
                    self.artist_list[self.item] = self.artist_list[self.item].replace("'","''")
                    cur.execute("SELECT URI FROM Track_List WHERE ARTIST_NAME = '" + self.artist_list[self.item] + "'")
                    rows = cur.fetchone()
                    for row in rows:
                        print("Adding an Artists Track to List! Working on Item " +
                              str(self.item) + " of " + str(self.trw), end='\r')
                        self.track_uri = row
                        self.artist_track_list.append(self.track_uri)
                        self.item += 1
                    continue
        except Error as e2:
            print("add_artist_track_uri_to_list")
            print(self.artist_list[self.item])
            print(self.item)
            print(e2)
        return
        
    def get_artist_data(self):
        self.item2 = 0
        while self.item2 < self.trw:
            uriid = self.artist_track_list[self.item2][14:]
            query = "https://api.spotify.com/v1/tracks/{}".format(uriid)
            response = requests.request("get", url=query, headers={"Content-type": "application/json", "Authorization": "Bearer {}".format(self.spotify_token)})
            json_data = json.loads(response.text)
            self.track_name = json_data["name"]
            self.track_name = self.track_name.replace("'", "")
            self.artist_name = json_data["artists"][0]["name"]
            self.artist_name = self.artist_name.replace("'", "`")
            self.artist_id = json_data["artists"][0]["id"]
            self.artist_track_uri = self.artist_track_list[self.item2]
            print("Getting Artists ID's! Working on Item " +
                  str(self.item2) + " of " + str(self.trw), end='\r')
            self.update_artist_id()
            self.item2 += 1
        print()

    def update_artist_id(self):
        conn = self.create_connection(self.database)
        with conn:
            cur = conn.cursor()
            try:
                cur.execute("UPDATE OR IGNORE Artist_Genre SET ARTISt_URI = '" + self.artist_id + "' WHERE ARTIST_NAME = '" + self.artist_list[self.item2] + "'")
                cur.execute("UPDATE OR IGNORE Artist_Genre SET SPOT_ARTIST_NAME =  '" + self.artist_name + "' WHERE ARTIST_NAME = '" + self.artist_list[self.item2] + "'")
                cur.execute("UPDATE OR IGNORE Artist_Genre SET TRACK_URI = '" + self.artist_track_uri + "' WHERE ARTIST_NAME = '" + self.artist_list[self.item2] + "'")
                cur.execute("UPDATE OR IGNORE Artist_Genre SET TRACK_NAME = '" + self.track_name + "' WHERE ARTIST_NAME = '" + self.artist_list[self.item2] + "'")
                conn.commit()
            except Error as e5:
                print("update_track_list_table")
                print(e5)
                return    

a = genre2()
a.call_refresh()
a.do_the_business()
