# Design: alarm-clock-module

## Architecture
- Flutter owns alarm domain data, UX, recurrence calculation, and persistence.
- Android owns exact wakeup delivery through AlarmManager/setAlarmClock and notification actions.
- Communication uses a MethodChannel, tentatively `pluriwave/alarm_scheduler`.
- Existing `ServicioTimer` remains unchanged; a new `ServicioAlarmas` manages alarms.

## Data model
- `AlarmaMusical`: id, name, enabled, hour, minute, scheduleType, weekdays, stationUuid/url snapshot, fallbackStation snapshot, bundledSoundId, volume, snoozeMinutes, soundOnVacation, nextOccurrenceAt.
- `RangoVacaciones`: id, name, startDate, endDate, enabled.
- `ExcepcionAlarma`: alarmId, occurrenceAt, type (`skipNext`, `snooze`, `vacation`).
- `EjecucionAlarma`: scheduledAt, firedAt, status, fallbackUsed, failureReason.

## Persistence
Use JSON files or SharedPreferences for MVP to avoid risky DB migrations. If alarm history grows, migrate to sqflite later.

## Android native components
- `PluriWaveAlarmReceiver`: receives exact alarm and pre-alarm actions.
- `PluriWaveAlarmScheduler`: schedules/cancels next alarm and pre-notification.
- `PluriWaveAlarmActivity` or full-screen notification target for the ringing UI.
- Notification channels:
  - `alarm_pre_notice`: silent, low/default importance, no sound.
  - `alarm_ringing`: high importance for active alarms.

## Audio strategy
MVP: when the alarm fires, bring the Flutter app/alarm screen forward and use existing audio_service to play station/fallback. If Flutter/audio startup fails, Android should be able to play a bundled raw sound as last fallback.

## Reliability diagnostics
Expose statuses for:
- exact alarm permission (`canScheduleExactAlarms`).
- notification permission.
- battery optimization warning.
- DND policy access for optional override.

## Key decision
Use `setAlarmClock` for actual alarm occurrences because Android treats these as critical and visible user alarms. Use a separate exact/inexact notification alarm for the 30-minute silent pre-notice depending on permission and platform behavior.
