health_datasource_wrapper.dart 5.04 KB
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/services/user_state_service.dart';
import 'package:doublefeel_flutter/data/models/health/activity/activity_burn_statistics_data_v2.dart';
import 'package:doublefeel_flutter/data/models/health/health_v2_models.dart';
import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart';
import 'package:doublefeel_flutter/data/models/health/sleep/sleep_statistics_data.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:get/get_instance/src/extension_instance.dart';

import 'health_datasource.dart';

/// Routes each report type to its current source of truth.
class HealthDataSourceWrapper implements HealthDataSource {
  HealthDataSourceWrapper({
    required this.remoteDataSource,
    required this.localDataSource,
  });

  final HealthDataSource remoteDataSource;
  final HealthDataSource localDataSource;
  final _myUserId = Get.find<UserStateService>().userId;
  static const _hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';

  @override
  Future<AppResult<SleepStatisticsData>> getSleepStatistics(
    int dateRangeType,
    int startDate, {
    int? queryUserId,
  }) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }
    return dataSource.getSleepStatistics(
      dateRangeType,
      startDate,
      queryUserId: queryUserId,
    );
  }

  @override
  Future<AppResult<ActivityBurnStatisticsDataV2>> getActivityBurnStatistics(
    int dateRangeType,
    int startDate, {
    int? queryUserId,
  }) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getActivityBurnStatistics(
      dateRangeType,
      startDate,
      queryUserId: queryUserId,
    );
  }

  @override
  Future<AppResult<HrvStatisticsDataV2>> getHrvStatistics(
    int dateRangeType,
    int startDate, {
    int? queryUserId,
  }) async {
    final stopwatch = Stopwatch()..start();
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }
    final sourceName =
        identical(dataSource, localDataSource) ? 'local' : 'remote';
    _logHrvTrend(
      'wrapper_getHrvStatistics_start source=$sourceName '
      'dateRangeType=$dateRangeType startDate=$startDate '
      'queryUserId=$queryUserId myUserId=$_myUserId',
    );

    final result = await dataSource.getHrvStatistics(
      dateRangeType,
      startDate,
      queryUserId: queryUserId,
    );
    _logHrvTrend(
      'wrapper_getHrvStatistics_finish source=$sourceName '
      'success=${result is AppSuccess} '
      'elapsedMs=${stopwatch.elapsedMilliseconds}',
    );
    return result;
  }

  @override
  Future<AppResult<V2HealthEverUploaded>> getHealthDataEverUploaded() {
    return localDataSource.getHealthDataEverUploaded();
  }

  @override
  Future<AppResult<V2ActivityTarget>> getV2ActivityTarget(
      int? queryUserId, int initDate) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getV2ActivityTarget(queryUserId, initDate);
  }

  @override
  Future<AppResult<V2HealthData>> getV2HealthData(
      int? queryUserId, int intDate) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getV2HealthData(queryUserId, intDate);
  }

  @override
  Future<AppResult<V2HrvTrendData>> getV2HrvTrend(
      int? queryUserId, int intDate) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getV2HrvTrend(queryUserId, intDate);
  }

  @override
  Future<AppResult<V2LatestHrvData>> getV2LatestHrv(
      int? queryUserId, int intDate) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getV2LatestHrv(queryUserId, intDate);
  }

  @override
  Future<AppResult<V2RealtimeStressData>> getV2RealtimeStress(
      int? queryUserId, int intDate) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getV2RealtimeStress(queryUserId, intDate);
  }

  @override
  Future<AppResult<V2StressScore>> getV2StressScore(
      int? queryUserId, int intDate) {
    HealthDataSource dataSource = remoteDataSource;
    if (queryUserId == null || _myUserId == queryUserId) {
      dataSource = localDataSource;
    }

    return dataSource.getV2StressScore(queryUserId, intDate);
  }

  void _logHrvTrend(String message) {
    debugPrint('$_hrvTrendLogMarker $message');
  }
}