import 'package:flutter_test/flutter_test.dart';
import 'package:jamshalat_masjid_screen/core/enums.dart';
import 'package:jamshalat_masjid_screen/data/local/models.dart';
import 'package:jamshalat_masjid_screen/data/services/hijri_service.dart';
import 'package:jamshalat_masjid_screen/data/services/sync_service.dart';

void main() {
  group('PrayerName display labels', () {
    test('uses Jumat label for Friday dzuhur', () {
      expect(
        PrayerName.dzuhur.displayLabel(isFriday: true),
        'JUMAT',
      );
      expect(
        PrayerName.dzuhur.displayLabel(isFriday: false),
        'Dzuhur',
      );
    });

    test('marks fardhu prayers correctly', () {
      expect(PrayerName.subuh.isFardhu, isTrue);
      expect(PrayerName.imsak.isFardhu, isFalse);
    });
  });

  group('AppSettings copyWith', () {
    test('preserves defaults and overrides selected fields', () {
      final settings = AppSettings();
      final updated = settings.copyWith(
        masjidName: 'Masjid Raya',
        cityIdApi: '1301',
        iqomahDzuhur: 12,
        lastAutoSyncAttemptDate: '2026-03-31T09:00:00.000',
      );

      expect(updated.masjidName, 'Masjid Raya');
      expect(updated.cityIdApi, '1301');
      expect(updated.iqomahDzuhur, 12);
      expect(updated.lastAutoSyncAttemptDate, '2026-03-31T09:00:00.000');
      expect(updated.masjidAddress, settings.masjidAddress);
      expect(updated.runningTexts, settings.runningTexts);
    });
  });

  group('HijriCalendarService parsing', () {
    test('extracts hijri label from MyQuran calendar response', () {
      final label = HijriCalendarService.parseHijriLabel({
        'status': true,
        'data': {
          'hijr': {
            'today': 'Senin, 11 Syawal 1447 H',
            'day': 11,
            'monthName': 'Syawal',
            'year': 1447,
          },
        },
      });

      expect(label, '11 Syawal 1447 H');
    });
  });

  group('ScheduleCacheStatus', () {
    test('derives cached date range and days left from stored schedules', () {
      final status = ScheduleCacheStatus.fromSchedules(
        [
          DailyPrayerSchedule(
            date: '2026-03-01',
            imsak: '04:20',
            subuh: '04:30',
            terbit: '05:45',
            dhuha: '06:10',
            dzuhur: '11:55',
            ashar: '15:10',
            maghrib: '17:58',
            isya: '19:05',
          ),
          DailyPrayerSchedule(
            date: '2026-04-30',
            imsak: '04:19',
            subuh: '04:29',
            terbit: '05:44',
            dhuha: '06:09',
            dzuhur: '11:54',
            ashar: '15:09',
            maghrib: '17:57',
            isya: '19:04',
          ),
        ],
        DateTime(2026, 3, 30),
      );

      expect(status.hasData, isTrue);
      expect(status.startDate, DateTime(2026, 3, 1));
      expect(status.endDate, DateTime(2026, 4, 30));
      expect(status.cachedDays, 2);
      expect(status.daysUntilRefresh, 31);
    });

    test('rolling window stale key helper keeps only current and next month', () {
      final staleKeys = SyncService.staleScheduleKeys(
        [
          '2026-02-28',
          '2026-03-01',
          '2026-04-30',
          '2026-05-01',
          'invalid-key',
        ],
        DateTime(2026, 3, 30),
      );

      expect(
        staleKeys,
        containsAll(<String>['2026-02-28', '2026-05-01', 'invalid-key']),
      );
      expect(staleKeys, isNot(contains('2026-03-01')));
      expect(staleKeys, isNot(contains('2026-04-30')));
    });
  });
}
