from just_playback import Playback
from time import sleep, time
from lyric_parse import parse_lyric
from threading import Thread
from datetime import datetime
from wcwidth import wcswidth
from app import MainWindow, QApplication


music = 'credits.mp3'
lyric = 'credits.lrc'


player = Playback(music)


def time_convert(raw):
    if isinstance(raw, float):
        minutes = int(raw // 60)
        seconds = int(raw % 60)
        microsec = raw % 1
        return datetime.strptime(f'{minutes}:{seconds}.{("%.6f" % microsec)[2:]}', '%M:%S.%f')
    elif isinstance(raw, str):
        return datetime.strptime(raw, '%M:%S.%f')
    else:
        return datetime.strptime('00', '%S')


def display_lyric(player, lyrics, app):
    global stopped
    lyrics['59:59.999999'] = ''
    index = 1
    times = list(lyrics.keys())
    previous_lrc = ''
    while index < len(lyrics) and not stopped:
        if index < (len(lyrics) - 1) and time_convert(times[index]) < time_convert(player.curr_pos):
            index += 1
            continue
        if index >= 1 and time_convert(times[index - 1]) > time_convert(player.curr_pos):
            index -= 1
            continue
        if previous_lrc != lyrics[times[index - 1]]:
                previous_lrc = lyrics[times[index - 1]]
                app.lyrics.set_lyrics([previous_lrc, lyrics[times[index]]])
        sleep(0.01)


def catch():
    global player
    try:
        while True:
            #print_lyric(player, lyrics)
            #print(player.current_time)
            r = input()
            delta = r.count('k') * 5 - (len(r) - r.count('k')) * 5
            player.seek(player.curr_pos + delta)
    except KeyboardInterrupt:
        pass


if True:
    stopped = False
    player.play()
    player.current_time = 80
    app = QApplication()
    window = MainWindow()
    window.show()
    with open(lyric, encoding='utf-8') as f:
        lyrics = parse_lyric(f.read())
    Thread(target=display_lyric, args=(player, lyrics, window)).start()
    Thread(target=catch).start()
    app.exec()
    stopped = True
    player.stop()
