home_interact_route_arguments.dart 4.79 KB
import 'package:doublefeel_flutter/app/modules/interact/models/interact_route_arguments.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';

/// Builds the typed interaction context emitted by cards on the app home page.
class HomeInteractRouteArguments {
  const HomeInteractRouteArguments._();

  static InteractRouteArguments? averageHrv({
    required BuildContext context,
    required int? friendUserId,
    required DateTime date,
    required int value,
  }) => value <= 0
      ? null
      : _create(
          context: context,
          friendUserId: friendUserId,
          date: date,
          metricTitle: context.l10n.averageHrvForTheDay,
          values: [
            InteractDisplayValue(
              type: InteractValueType.averageHrv,
              value: value,
              unit: InteractValueUnit.milliseconds,
            ),
          ],
        );

  static InteractRouteArguments? restingHeartRate({
    required BuildContext context,
    required int? friendUserId,
    required DateTime date,
    required int value,
  }) => value <= 0
      ? null
      : _create(
          context: context,
          friendUserId: friendUserId,
          date: date,
          metricTitle: context.l10n.restingHeartRate,
          values: [
            InteractDisplayValue(
              type: InteractValueType.restingHeartRate,
              value: value,
              unit: InteractValueUnit.beatsPerMinute,
            ),
          ],
        );

  static InteractRouteArguments? sleep({
    required BuildContext context,
    required int? friendUserId,
    required DateTime date,
    required int durationSeconds,
    required double? qualityScore,
    required int? qualityState,
    required int? averageHeartRate,
  }) => durationSeconds <= 0
      ? null
      : _create(
          context: context,
          friendUserId: friendUserId,
          date: date,
          metricTitle: context.l10n.sleep,
          values: [
            InteractDisplayValue(
              type: InteractValueType.sleepDuration,
              value: durationSeconds,
              unit: InteractValueUnit.seconds,
            ),
            if (qualityScore != null)
              InteractDisplayValue(
                type: InteractValueType.sleepQualityScore,
                value: qualityScore,
                unit: InteractValueUnit.score,
              ),
            if (qualityState != null)
              InteractDisplayValue(
                type: InteractValueType.sleepQualityState,
                value: qualityState,
                unit: InteractValueUnit.state,
              ),
            if (averageHeartRate != null && averageHeartRate > 0)
              InteractDisplayValue(
                type: InteractValueType.averageSleepHeartRate,
                value: averageHeartRate,
                unit: InteractValueUnit.beatsPerMinute,
              ),
          ],
        );

  static InteractRouteArguments? fitness({
    required BuildContext context,
    required int? friendUserId,
    required DateTime date,
    required int activeCalories,
    required int exerciseSeconds,
    required int standHours,
  }) => _create(
    context: context,
    friendUserId: friendUserId,
    date: date,
    metricTitle: context.l10n.fitness,
    values: [
      if (activeCalories > 0)
        InteractDisplayValue(
          type: InteractValueType.activeCalories,
          value: activeCalories,
          unit: InteractValueUnit.kilocalories,
        ),
      if (exerciseSeconds > 0)
        InteractDisplayValue(
          type: InteractValueType.exerciseDuration,
          value: exerciseSeconds,
          unit: InteractValueUnit.seconds,
        ),
      if (standHours > 0)
        InteractDisplayValue(
          type: InteractValueType.standDuration,
          value: standHours,
          unit: InteractValueUnit.hours,
        ),
    ],
  );

  static InteractRouteArguments? _create({
    required BuildContext context,
    required int? friendUserId,
    required DateTime date,
    required String metricTitle,
    required List<InteractDisplayValue> values,
  }) {
    if (friendUserId == null || friendUserId <= 0 || values.isEmpty) {
      return null;
    }
    return InteractRouteArguments(
      friendUserId: friendUserId,
      page: InteractPageSource.home,
      title: '${_dateLabel(context, date)} · $metricTitle',
      date: DateUtils.dateOnly(date),
      values: values,
    );
  }

  static String _dateLabel(BuildContext context, DateTime date) {
    final today = DateUtils.dateOnly(DateTime.now());
    final target = DateUtils.dateOnly(date);
    if (target == today) return context.l10n.today;
    if (target == today.subtract(const Duration(days: 1))) {
      return context.l10n.yesterday;
    }
    return MaterialLocalizations.of(context).formatMediumDate(target);
  }
}