import 'package:flutter_test/flutter_test.dart';
import 'package:pluriwave/modelos/alarma_musical.dart';
import 'package:pluriwave/servicios/servicio_programacion_alarmas.dart';

void main() {
  group('ServicioProgramacionAlarmas', () {
    final servicio = ServicioProgramacionAlarmas();

    test('calcula la próxima alarma diaria futura', () {
      final alarma = AlarmaMusical(
        id: 'a1',
        nombre: 'Diaria',
        hora: 7,
        minuto: 30,
        tipoProgramacion: TipoProgramacionAlarma.diaria,
        diasSemana: const [],
      );

      final proxima = servicio.calcularProxima(
        alarma: alarma,
        desde: DateTime(2026, 5, 21, 7),
      );

      expect(proxima, DateTime(2026, 5, 21, 7, 30));
    });

    test('salta vacaciones si la alarma no debe sonar esos días', () {
      final alarma = AlarmaMusical(
        id: 'a2',
        nombre: 'Laboral',
        hora: 8,
        minuto: 0,
        tipoProgramacion: TipoProgramacionAlarma.diaria,
        diasSemana: const [],
        sonarEnVacaciones: false,
      );

      final proxima = servicio.calcularProxima(
        alarma: alarma,
        desde: DateTime(2026, 8, 1, 7),
        vacaciones: [
          RangoVacaciones(
            id: 'v1',
            nombre: 'Verano',
            inicio: DateTime(2026, 8),
            fin: DateTime(2026, 8, 3),
          ),
        ],
      );

      expect(proxima, DateTime(2026, 8, 4, 8));
    });

    test('saltar próxima solo omite esa ejecución', () {
      final alarma = AlarmaMusical(
        id: 'a3',
        nombre: 'Diaria',
        hora: 9,
        minuto: 0,
        tipoProgramacion: TipoProgramacionAlarma.diaria,
        diasSemana: const [],
      );
      final omitida = DateTime(2026, 5, 22, 9);

      final proxima = servicio.calcularProxima(
        alarma: alarma,
        desde: DateTime(2026, 5, 22, 8),
        excepciones: [
          ExcepcionAlarma(alarmaId: 'a3', ejecucion: omitida, tipo: 'skipNext'),
        ],
      );

      expect(proxima, DateTime(2026, 5, 23, 9));
    });

    test('snooze solo permite 3, 5 o 10 minutos y cae a 5', () {
      expect(
        servicio.calcularSnooze(DateTime(2026, 5, 21, 7), 10),
        DateTime(2026, 5, 21, 7, 10),
      );
      expect(
        servicio.calcularSnooze(DateTime(2026, 5, 21, 7), 99),
        DateTime(2026, 5, 21, 7, 5),
      );
    });
  });
}
