from datetime import datetime, timedelta from alarm_logger import AlarmLogger class AlarmLogic: def __init__(self, api_client): self.logger = AlarmLogger() self.api_client = api_client self.alarms = [] self.current_alarm = None self.snooze_minutes = 5 self.snooze_until = None def refresh_alarms(self): """Fetches alarms from the API and updates the local list.""" try: self.alarms = self.api_client.get_alarms() except Exception as e: raise RuntimeError(f"Failed to fetch alarms: {str(e)}") def create_alarm(self, hour, minute, date=None, weekdays=None): """Creates a new alarm.""" alarm_data = { "name": f"Alarm {hour:02d}:{minute:02d}", "time": f"{hour:02d}:{minute:02d}:00", "enabled": True, "repeat_rule": {"type": "once"}, "snooze": { "enabled": True, "duration": self.snooze_minutes, "max_count": 3 } } if weekdays: alarm_data["repeat_rule"] = { "type": "weekly", "days": weekdays } elif date: alarm_data["repeat_rule"] = { "type": "once", "date": date.strftime("%Y-%m-%d") } try: self.api_client.create_alarm(alarm_data) self.refresh_alarms() self.logger.log_alarm_created(alarm_data) except Exception as e: self.logger.log_system_error(f"Alarm creation failed: {e}", exc_info=True) raise RuntimeError(f"Failed to create alarm: {str(e)}") def stop_alarm(self): """Stops the current alarm.""" if self.current_alarm: try: alarm_data = self.current_alarm.copy() alarm_data["enabled"] = False self.api_client.update_alarm(self.current_alarm["id"], alarm_data) self.current_alarm = None self.snooze_until = None except Exception as e: self.logger.log_system_error(f"Failed to stop alarm: {e}", exc_info=True) raise RuntimeError(f"Failed to stop alarm: {str(e)}") def snooze_alarm(self): """Snoozes the current alarm.""" if self.current_alarm: self.snooze_until = datetime.now() + timedelta(minutes=self.snooze_minutes) self.stop_alarm() def check_alarms(self): """Checks if any alarm should trigger based on the current time.""" current_time = datetime.now() if self.snooze_until and current_time >= self.snooze_until: self.current_alarm = {"time": self.snooze_until.strftime("%H:%M:%S")} self.snooze_until = None if not self.current_alarm: self.refresh_alarms() for alarm in self.alarms: alarm_time = datetime.strptime(alarm["time"], "%H:%M:%S").time() if (alarm_time.hour == current_time.hour and alarm_time.minute == current_time.minute and alarm["enabled"]): self.current_alarm = alarm break