health_models.dart 10.8 KB
import 'package:json_annotation/json_annotation.dart';

import '../enums/app_enums.dart';

part 'health_models.g.dart';

@JsonSerializable()
class TodayStatusData {
  const TodayStatusData({
    this.recentData,
    this.hrvDataList,
    this.heartRateDataList,
    this.spo2DataList,
    this.sleepDuration,
  });

  @JsonKey(name: 'recent_data')
  final TodayStatusRecentData? recentData;
  @JsonKey(name: 'hrv_data_list')
  final List<TodayHrvData>? hrvDataList;
  @JsonKey(name: 'heart_rate_data_list')
  final List<TodayHeartRateData>? heartRateDataList;
  @JsonKey(name: 'oxygen_saturation_data_list')
  final List<TodaySpo2Data>? spo2DataList;
  @JsonKey(name: 'sleep_duration')
  final int? sleepDuration;

  factory TodayStatusData.fromJson(Map<String, dynamic> json) =>
      _$TodayStatusDataFromJson(json);
  Map<String, dynamic> toJson() => _$TodayStatusDataToJson(this);
}

@JsonSerializable()
class TodayStatusRecentData {
  const TodayStatusRecentData({
    this.heartRate,
    this.spo2,
    this.move,
    this.exercise,
    this.stand,
    this.steps,
  });

  @JsonKey(name: 'heart_rate')
  final int? heartRate;
  @JsonKey(name: 'oxygen_saturation')
  final double? spo2;
  final int? move;
  final int? exercise;
  final int? stand;
  final int? steps;

  factory TodayStatusRecentData.fromJson(Map<String, dynamic> json) =>
      _$TodayStatusRecentDataFromJson(json);
  Map<String, dynamic> toJson() => _$TodayStatusRecentDataToJson(this);
}

@JsonSerializable()
class TodayHrvData {
  const TodayHrvData({this.time, this.value, this.hrvBaseline});

  final int? time;
  final double? value;
  @JsonKey(name: 'hrv_baseline')
  final double? hrvBaseline;

  HrvStatus? get hrvStatus {
    final actualHrv = value;
    if (actualHrv == null) return null;
    final baseline = hrvBaseline ?? 0;
    if (baseline > 0) {
      if (actualHrv >= 1.2 * baseline) return HrvStatus.energetic;
      if (actualHrv <= 0.8 * baseline) return HrvStatus.overload;
      return HrvStatus.normal;
    }
    if (actualHrv >= 128) return HrvStatus.energetic;
    if (actualHrv <= 30) return HrvStatus.overload;
    return HrvStatus.normal;
  }

  factory TodayHrvData.fromJson(Map<String, dynamic> json) =>
      _$TodayHrvDataFromJson(json);
  Map<String, dynamic> toJson() => _$TodayHrvDataToJson(this);
}

@JsonSerializable()
class TodayHeartRateData {
  const TodayHeartRateData({this.index, this.minimum, this.maximum});

  @JsonKey(name: 'bi_hour_index')
  final int? index;
  final int? minimum;
  final int? maximum;

  factory TodayHeartRateData.fromJson(Map<String, dynamic> json) =>
      _$TodayHeartRateDataFromJson(json);
  Map<String, dynamic> toJson() => _$TodayHeartRateDataToJson(this);
}

@JsonSerializable()
class TodaySpo2Data {
  const TodaySpo2Data({this.index, this.average});

  @JsonKey(name: 'bi_hour_index')
  final int? index;
  final double? average;

  factory TodaySpo2Data.fromJson(Map<String, dynamic> json) =>
      _$TodaySpo2DataFromJson(json);
  Map<String, dynamic> toJson() => _$TodaySpo2DataToJson(this);
}

@JsonSerializable()
class PkCurrentMonthData {
  const PkCurrentMonthData({
    this.userWinAmount,
    this.partnerWinAmount,
    this.todayRecord,
    this.monthRecordList,
  });

  @JsonKey(name: 'user_win')
  final int? userWinAmount;
  @JsonKey(name: 'pair_user_win')
  final int? partnerWinAmount;
  @JsonKey(name: 'data_today')
  final PkRecord? todayRecord;
  @JsonKey(name: 'month_data_list')
  final List<PkRecord>? monthRecordList;

  factory PkCurrentMonthData.fromJson(Map<String, dynamic> json) =>
      _$PkCurrentMonthDataFromJson(json);
  Map<String, dynamic> toJson() => _$PkCurrentMonthDataToJson(this);
}

@JsonSerializable()
class PkRecord {
  const PkRecord({
    this.date,
    this.userScore,
    this.userMove,
    this.userStand,
    this.userSteps,
    this.partnerScore,
    this.partnerMove,
    this.partnerStand,
    this.partnerSteps,
  });

  final int? date;
  @JsonKey(name: 'user_score')
  final int? userScore;
  @JsonKey(name: 'user_move')
  final int? userMove;
  @JsonKey(name: 'user_stand')
  final int? userStand;
  @JsonKey(name: 'user_steps')
  final int? userSteps;
  @JsonKey(name: 'pair_user_score')
  final int? partnerScore;
  @JsonKey(name: 'pair_user_move')
  final int? partnerMove;
  @JsonKey(name: 'pair_user_stand')
  final int? partnerStand;
  @JsonKey(name: 'pair_user_steps')
  final int? partnerSteps;

  factory PkRecord.fromJson(Map<String, dynamic> json) =>
      _$PkRecordFromJson(json);
  Map<String, dynamic> toJson() => _$PkRecordToJson(this);
}

@JsonSerializable()
class SleepStatisticsData {
  const SleepStatisticsData({
    this.avgSleepDuration,
    this.awakePercentage,
    this.corePercentage,
    this.deepPercentage,
    this.remPercentage,
    this.sleepTrendList,
    this.asleepTimeDistributionList,
  });

  @JsonKey(name: 'avg_sleep_duration')
  final int? avgSleepDuration;
  @JsonKey(name: 'awake_percentage')
  final double? awakePercentage;
  @JsonKey(name: 'core_percentage')
  final double? corePercentage;
  @JsonKey(name: 'deep_percentage')
  final double? deepPercentage;
  @JsonKey(name: 'rem_percentage')
  final double? remPercentage;
  @JsonKey(name: 'sleep_trend_list')
  final List<SleepTrend>? sleepTrendList;
  @JsonKey(name: 'asleep_time_trend_list')
  final List<AsleepTimeDistribution>? asleepTimeDistributionList;

  factory SleepStatisticsData.fromJson(Map<String, dynamic> json) =>
      _$SleepStatisticsDataFromJson(json);
  Map<String, dynamic> toJson() => _$SleepStatisticsDataToJson(this);
}

@JsonSerializable()
class SleepTrend {
  const SleepTrend({this.timeKey, this.average});

  @JsonKey(name: 'time_key')
  final int? timeKey;
  final int? average;

  factory SleepTrend.fromJson(Map<String, dynamic> json) =>
      _$SleepTrendFromJson(json);
  Map<String, dynamic> toJson() => _$SleepTrendToJson(this);
}

@JsonSerializable()
class AsleepTimeDistribution {
  const AsleepTimeDistribution({this.timeKey, this.average});

  @JsonKey(name: 'time_key')
  final int? timeKey;
  final String? average;

  factory AsleepTimeDistribution.fromJson(Map<String, dynamic> json) =>
      _$AsleepTimeDistributionFromJson(json);
  Map<String, dynamic> toJson() => _$AsleepTimeDistributionToJson(this);
}

@JsonSerializable()
class ActivityBurnStatisticsData {
  const ActivityBurnStatisticsData({
    this.totalCaloriesBurned,
    this.avgCaloriesBurned,
    this.maxCaloriesBurned,
    this.minCaloriesBurned,
    this.totalSteps,
    this.totalStand,
    this.caloriesBurnedTrendList,
    this.exerciseTimeTrendList,
    this.activityTargetInfo,
  });

  @JsonKey(name: 'total_move')
  final int? totalCaloriesBurned;
  @JsonKey(name: 'avg_move')
  final double? avgCaloriesBurned;
  @JsonKey(name: 'max_move')
  final CaloriesBurnedValue? maxCaloriesBurned;
  @JsonKey(name: 'min_move')
  final CaloriesBurnedValue? minCaloriesBurned;
  @JsonKey(name: 'total_steps')
  final int? totalSteps;
  @JsonKey(name: 'total_stand')
  final int? totalStand;
  @JsonKey(name: 'move_trend_list')
  final List<CaloriesBurnedTrend>? caloriesBurnedTrendList;
  @JsonKey(name: 'excercise_trend_list')
  final List<ExerciseTimeTrend>? exerciseTimeTrendList;
  @JsonKey(name: 'activity_target_info')
  final ActivityTargetInfo? activityTargetInfo;

  factory ActivityBurnStatisticsData.fromJson(Map<String, dynamic> json) =>
      _$ActivityBurnStatisticsDataFromJson(json);
  Map<String, dynamic> toJson() => _$ActivityBurnStatisticsDataToJson(this);
}

@JsonSerializable()
class CaloriesBurnedValue {
  const CaloriesBurnedValue({this.date, this.value});

  final int? date;
  final int? value;

  factory CaloriesBurnedValue.fromJson(Map<String, dynamic> json) =>
      _$CaloriesBurnedValueFromJson(json);
  Map<String, dynamic> toJson() => _$CaloriesBurnedValueToJson(this);
}

@JsonSerializable()
class CaloriesBurnedTrend {
  const CaloriesBurnedTrend({this.timeKey, this.value});

  @JsonKey(name: 'time_key')
  final int? timeKey;
  final int? value;

  factory CaloriesBurnedTrend.fromJson(Map<String, dynamic> json) =>
      _$CaloriesBurnedTrendFromJson(json);
  Map<String, dynamic> toJson() => _$CaloriesBurnedTrendToJson(this);
}

@JsonSerializable()
class ExerciseTimeTrend {
  const ExerciseTimeTrend({this.timeKey, this.value});

  @JsonKey(name: 'time_key')
  final int? timeKey;
  final int? value;

  factory ExerciseTimeTrend.fromJson(Map<String, dynamic> json) =>
      _$ExerciseTimeTrendFromJson(json);
  Map<String, dynamic> toJson() => _$ExerciseTimeTrendToJson(this);
}

@JsonSerializable()
class ActivityTargetInfo {
  const ActivityTargetInfo({this.move, this.step, this.stand});

  final int? move;
  final int? step;
  final int? stand;

  factory ActivityTargetInfo.fromJson(Map<String, dynamic> json) =>
      _$ActivityTargetInfoFromJson(json);
  Map<String, dynamic> toJson() => _$ActivityTargetInfoToJson(this);
}

@JsonSerializable()
class HrvStatisticsData {
  const HrvStatisticsData({
    this.avgHrv,
    this.avgHrvBaseline,
    this.avgWalkingHeartRate,
    this.avgRestingHeartRate,
    this.avgSleepingHeartRate,
    this.hrvTrendList,
    this.hrvDistributionList,
  });

  @JsonKey(name: 'avg_hrv')
  final double? avgHrv;
  @JsonKey(name: 'avg_hrv_baseline')
  final double? avgHrvBaseline;
  @JsonKey(name: 'avg_walking_heart_rate')
  final double? avgWalkingHeartRate;
  @JsonKey(name: 'avg_resting_heart_rate')
  final double? avgRestingHeartRate;
  @JsonKey(name: 'avg_sleeping_heart_rate')
  final double? avgSleepingHeartRate;
  @JsonKey(name: 'hrv_trend_list')
  final List<HrvTrend>? hrvTrendList;
  @JsonKey(name: 'hrv_distribution_list')
  final List<HrvDistribution>? hrvDistributionList;

  factory HrvStatisticsData.fromJson(Map<String, dynamic> json) =>
      _$HrvStatisticsDataFromJson(json);
  Map<String, dynamic> toJson() => _$HrvStatisticsDataToJson(this);
}

@JsonSerializable()
class HrvTrend {
  const HrvTrend({this.timeKey, this.average});

  @JsonKey(name: 'time_key')
  final int? timeKey;
  final double? average;

  factory HrvTrend.fromJson(Map<String, dynamic> json) =>
      _$HrvTrendFromJson(json);
  Map<String, dynamic> toJson() => _$HrvTrendToJson(this);
}

@JsonSerializable()
class HrvDistribution {
  const HrvDistribution({this.timeKey, this.dayCounts});

  @JsonKey(name: 'time_key')
  final int? timeKey;
  @JsonKey(name: 'day_counts')
  final HrvDistributionDayCount? dayCounts;

  factory HrvDistribution.fromJson(Map<String, dynamic> json) =>
      _$HrvDistributionFromJson(json);
  Map<String, dynamic> toJson() => _$HrvDistributionToJson(this);
}

@JsonSerializable()
class HrvDistributionDayCount {
  const HrvDistributionDayCount({
    this.stressful,
    this.normal,
    this.energetic,
  });

  final int? stressful;
  final int? normal;
  final int? energetic;

  factory HrvDistributionDayCount.fromJson(Map<String, dynamic> json) =>
      _$HrvDistributionDayCountFromJson(json);
  Map<String, dynamic> toJson() => _$HrvDistributionDayCountToJson(this);
}