import subprocess
import sys
import time
from datetime import datetime
import json
import requests
from pprint import pprint
import os
from dotenv import load_dotenv
load_dotenv()
USER = os.getenv("USER")
PASSWORD = os.getenv("PASSWORD")

stdout_file = 'logfile.log'
stderr_file = 'error_logfile.log'

sys.stdout = open(stdout_file, 'a')
sys.stderr = open(stderr_file, 'a')

def printout(content):
    print(f"{datetime.now().strftime('%H:%M:%S')} : {content}", file=sys.stdout)
    sys.stdout.flush()

def printerr(content):
    print(f"{datetime.now().strftime('%H:%M:%S')} : An error occurred: {str(content)}", file=sys.stderr)
    sys.stderr.flush()

def get_current_song():
    try:
        output = subprocess.check_output(['osascript', 'export.applescript']).decode('utf-8').strip()
        return output
    except subprocess.CalledProcessError as e:
        printerr(e)
        return e

def get_track_extras(song, artist, album):
    query = f"{song} {artist} {album}"
    params = {"media": "music", "entity": "song", "term": query}
    
    r = requests.get("https://itunes.apple.com/search", params=params)
    json_data =  r.json()
    if json_data["resultCount"] == 1:
        result = json_data["results"][0]
    elif json_data["resultCount"] > 1:
        result = json_data["results"][0]
    else :
        result = ''

    artwork_url = result["artworkUrl100"] if result else None
    itunes_url = result["trackViewUrl"] if result else None
    artist_url = result["artistViewUrl"] if result else None

    return (artwork_url, itunes_url, artist_url)

def post(currentsong):
    currentsong['user'] = USER
    currentsong['password'] = PASSWORD
    data = json.dumps(currentsong)
    try:
        r = requests.post(url+'/music/set', data=data, headers=headers)
        if r.status_code != 200:
            return r.status_code
        else :
            return r.text
    except Exception as e:
        print(f"An error occurred: {str(e)}", file=sys.stderr)

url = "https://api.noh.am" #RUN WEB
url = "http://127.0.0.1:5000" #DEV
url = "http://0.0.0.0:3005"

headers = {'Content-Type': 'application/json'}

def main():
    persistendId = ''
    prevstatus = ''
    while True:
        # print('getting data..', file=sys.stdout)
        # currentsong = json.loads(str(get_current_song()).replace("'''", '"'))
        currentsong = json.loads(get_current_song())

        if currentsong['status'] == 'playing':
            if currentsong['persistent ID'] != persistendId:
                persistendId = currentsong['persistent ID']
                currentsong['timestamp'] = time.time()
                (currentsong['artwork_url'], currentsong['itunes_url'], currentsong['artist_url']) = get_track_extras(currentsong['name'], currentsong['artist'], currentsong['album'])
                printout(f"{post(currentsong)}")
            timets = float(currentsong['duration'].replace(",", "."))-float(currentsong['pPosition'].replace(",", ".")) + 3
            prevstatus = 'playing'
        elif currentsong['status'] == 'not playing' and prevstatus != 'not playing':
            prevstatus = 'not playing'
            printout(f"{post({'status' : 'not playing'})}")
            timets = 5*60
        elif currentsong['status'] == 'not running' and prevstatus != 'not running':
            prevstatus = 'not running'
            printout(f"{post({'status' : 'not running'})}")
            timets = 5*60
        else:
            timets = 5*60

        time.sleep(timets)

if __name__ == "__main__":
    main()