import 'package:flutter_test/flutter_test.dart';
import 'package:christian_period_tracker/services/cycle_service.dart';
import 'package:christian_period_tracker/models/user_profile.dart';
import 'package:christian_period_tracker/models/cycle_entry.dart';

void main() {
  group('CycleService Tests', () {
    test('calculateCycleInfo returns follicular phase for null profile', () {
      final info = CycleService.calculateCycleInfo(null, []);
      expect(info.phase, CyclePhase.follicular);
      expect(info.dayOfCycle, 1);
    });

    test('calculateCycleInfo calculates follicular phase correctly (Day 7)', () {
      final now = DateTime.now();
      final lastPeriod = now.subtract(const Duration(days: 6)); // Today is Day 7
      final user = UserProfile(
        id: '1',
        name: 'Test',
        role: UserRole.wife,
        relationshipStatus: RelationshipStatus.married,
        averageCycleLength: 28,
        lastPeriodStartDate: lastPeriod,
        createdAt: now,
        updatedAt: now,
      );

      final info = CycleService.calculateCycleInfo(user, []);
      expect(info.dayOfCycle, 7);
      expect(info.phase, CyclePhase.follicular);
    });

    test('calculateCycleInfo calculates menstrual phase correctly (Day 2)', () {
      final now = DateTime.now();
      final lastPeriod = now.subtract(const Duration(days: 1)); // Today is Day 2
      final user = UserProfile(
        id: '1',
        name: 'Test',
        role: UserRole.wife,
        relationshipStatus: RelationshipStatus.married,
        averageCycleLength: 28,
        lastPeriodStartDate: lastPeriod,
        createdAt: now,
        updatedAt: now,
      );

      final info = CycleService.calculateCycleInfo(user, []);
      expect(info.dayOfCycle, 2);
      expect(info.phase, CyclePhase.menstrual);
    });

    test('calculateCycleInfo handles cycle length wrapping', () {
      final now = DateTime.now();
      // Last period was 30 days ago, cycle is 28 days -> Today is Day 3 of next cycle
      final lastPeriod = now.subtract(const Duration(days: 30)); 
      final user = UserProfile(
        id: '1',
        name: 'Test',
        role: UserRole.wife,
        relationshipStatus: RelationshipStatus.married,
        averageCycleLength: 28,
        lastPeriodStartDate: lastPeriod,
        createdAt: now,
        updatedAt: now,
      );

      final info = CycleService.calculateCycleInfo(user, []);
      expect(info.dayOfCycle, 3);
      expect(info.phase, CyclePhase.menstrual);
    });
  });
}
