from typing import Optional

from alarm import BaseAlarmClock, AlarmState
from datetime import time, datetime
from time import sleep
from pynput import keyboard
import numpy as np
import vlc


SNOOZE_KEY = keyboard.Key.up
ALARM_OFF_KEY = keyboard.Key.esc
SNOOZE_SEC = 5


def softmax(arr):
    val = np.exp(arr)
    return val / sum(val)


class SmartAlarmClock(BaseAlarmClock):

    def __init__(self, wake_time: Optional[time] = None, vlc_player=None):
        if wake_time:
            self.set_alarm(wake_time)
        super().__init__()

    def set_alarm(self, wake_time: time) -> time:
        print(f"SETTING ALARM to: {wake_time}")
        return super(SmartAlarmClock, self).set_alarm(wake_time)

    def start_alarm(self) -> None:
        print("STARTING ALARM")
        super(SmartAlarmClock, self).start_alarm()

    def sound_alarm(self) -> None:
        print("SOUNDING ALARM")
        super(SmartAlarmClock, self).sound_alarm()

    def snooze_alarm(self) -> None:
        print("SNOOZING ALARM")
        super(SmartAlarmClock, self).snooze_alarm()

    def stop_alarm(self, deactivate: bool = True) -> None:
        print("STOPPING ALARM")
        if self._current_state is AlarmState.PLAYING:
            print("STOPPED PLAYING ALARM")
        super(SmartAlarmClock, self).stop_alarm()

    def smart_alarm_mode(self, model):
        self.start_alarm()
        while not self.alarm_check_reached(datetime.now().time()):
            print(f"ALARM SLEEPING @: {datetime.now().time()}")
            sleep(1)
        self.sound_alarm()
        while self.current_state is not AlarmState.DEACTIVATED:
            with keyboard.Events() as events:
                for event in events:
                    if event.key == ALARM_OFF_KEY:
                        self.stop_alarm()
                        break
                    elif event.key == SNOOZE_KEY:
                        self.snooze_alarm()
                        sleep(SNOOZE_SEC)
                        self.sound_alarm()
                        break


if __name__ == '__main__':
    alarm_hour = int(input("What hour do you want the alarm to go off at?"))
    alarm_minute = int(input("What minute do you want the alarm to go off at?"))
    alarm_second = int(input("What second do you want the alarm to go off at?"))
    alarm_time = time(alarm_hour, alarm_minute, alarm_second)
    alarm_clock_class = SmartAlarmClock(alarm_time)
    ai_model = None
    alarm_clock_class.smart_alarm_mode(ai_model)