health_trend_control.dart 1.3 KB
import 'package:get/get.dart';

import '../../report_common/config/report_date_range_config.dart';
import '../../report_common/models/report_period.dart';

mixin HealthTrendControl on GetxController {
  final selectedTypeIndex = 0.obs;
  final selectedPeriod = ReportPeriod.week.obs;
  final selectedDate = ReportDateRangeConfig.clampDate(DateTime.now()).obs;

  void changeType(int index) {
    final nextIndex = normalizeTypeIndex(index);
    selectedTypeIndex.value = nextIndex;
    selectedPeriod.value = normalizePeriod(nextIndex, selectedPeriod.value);
  }

  void changePeriod(ReportPeriod period) {
    selectedPeriod.value = normalizePeriod(selectedTypeIndex.value, period);
  }

  void changeDate(DateTime date) {
    selectedDate.value = ReportDateRangeConfig.clampDate(date);
  }

  int normalizeTypeIndex(int index) => index >= 0 && index < 3 ? index : 0;

  ReportPeriod normalizePeriod(int typeIndex, ReportPeriod period) {
    final periods = supportedPeriods(normalizeTypeIndex(typeIndex));
    return periods.contains(period) ? period : periods.first;
  }

  List<ReportPeriod> supportedPeriods(int typeIndex) {
    return normalizeTypeIndex(typeIndex) == 0
        ? const [ReportPeriod.week, ReportPeriod.month, ReportPeriod.year]
        : const [ReportPeriod.day, ReportPeriod.week, ReportPeriod.month];
  }
}