from enum import Enum, auto
from datetime import time, datetime
from typing import Optional


class AlarmState(Enum):
    SET = auto(),
    RUNNING = auto(),
    PLAYING = auto(),
    SNOOZED = auto(),
    DEACTIVATED = auto(),


class BaseAlarmClock:
    _current_state: AlarmState
    _wake_time: datetime

    def __init__(self, wake_time: Optional[datetime] = None):
        self._wake_time = wake_time if wake_time else datetime.utcnow()
        self._current_state = AlarmState.DEACTIVATED

    @property
    def current_state(self):
        return self._current_state

    @property
    def wake_time(self):
        return self._wake_time

    def set_alarm(self, wake_time: datetime) -> datetime:
        # print(f"SETTING ALARM to: {wake_time}")
        self._current_state = AlarmState.SET
        self._wake_time = wake_time
        return self._wake_time

    def start_alarm(self) -> None:
        # print("STARTING ALARM")
        self._current_state = AlarmState.RUNNING

    def sound_alarm(self) -> None:
        # print("SOUNDING ALARM")
        self._current_state = AlarmState.PLAYING

    def snooze_alarm(self) -> None:
        # print("SNOOZING ALARM")
        self._current_state = AlarmState.SNOOZED

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

    def alarm_check_reached(self, current_time: datetime) -> bool:
        return current_time >= self._wake_time if self._current_state is AlarmState.RUNNING else False