sleep_statistics_data.dart 6.85 KB
class SleepStatisticsData {
  SleepStatisticsData({
    this.avgSleepDuration,
    this.avgSleepScore,
    this.avgSleepEvaluate,
    this.qoqAvgSleepDuration,
    this.qoqSleepScore,
    this.qoqSleepEvaluate,
    this.sleepTrendList,
    this.asleepTimeTrendList,
    this.bestSleepInfo,
    this.worstSleepInfo,
    this.earliestSleepInfo,
    this.latestSleepInfo,
    this.hrList,
    this.avgHr,
    this.maxHr,
    this.minHr,
    this.sleepTargetDuration,
  });

  factory SleepStatisticsData.fromJson(Map<String, dynamic> json) {
    return SleepStatisticsData(
      avgSleepDuration: _parseNum(json['avg_sleep_duration']),
      avgSleepScore: _parseNum(json['avg_sleep_score']),
      avgSleepEvaluate: _parseNum(json['avg_sleep_evaluate']),
      qoqAvgSleepDuration: _parseNum(json['qoq_avg_sleep_duration']),
      qoqSleepScore: _parseNum(json['qoq_sleep_score']),
      qoqSleepEvaluate: _parseNum(json['qoq_sleep_evaluate']),
      sleepTrendList:
          _parseList(json['sleep_trend_list'], SleepTrendList.fromJson),
      asleepTimeTrendList: _parseList(
        json['asleep_time_trend_list'],
        AsleepTimeTrendList.fromJson,
      ),
      bestSleepInfo: _parseMap(json['best_sleep_info'], BestSleepInfo.fromJson),
      worstSleepInfo:
          _parseMap(json['worst_sleep_info'], WorstSleepInfo.fromJson),
      earliestSleepInfo:
          _parseMap(json['earliest_sleep_info'], EarliestSleepInfo.fromJson),
      latestSleepInfo:
          _parseMap(json['latest_sleep_info'], LatestSleepInfo.fromJson),
      hrList: _parseList(json['hr_list'], SleepHrItem.fromJson),
      avgHr: _parseNum(json['avg_hr']),
      maxHr: _parseNum(json['max_hr']),
      minHr: _parseNum(json['min_hr']),
      sleepTargetDuration: _parseNum(json['sleep_target_duration']),
    );
  }

  num? avgSleepDuration;
  num? avgSleepScore;
  num? avgSleepEvaluate;
  num? qoqAvgSleepDuration;
  num? qoqSleepScore;
  num? qoqSleepEvaluate;
  List<SleepTrendList>? sleepTrendList;
  List<AsleepTimeTrendList>? asleepTimeTrendList;
  BestSleepInfo? bestSleepInfo;
  WorstSleepInfo? worstSleepInfo;
  EarliestSleepInfo? earliestSleepInfo;
  LatestSleepInfo? latestSleepInfo;
  List<SleepHrItem>? hrList;
  num? avgHr;
  num? maxHr;
  num? minHr;
  num? sleepTargetDuration;

  Map<String, dynamic> toJson() => {
        'avg_sleep_duration': avgSleepDuration,
        'avg_sleep_score': avgSleepScore,
        'avg_sleep_evaluate': avgSleepEvaluate,
        'qoq_avg_sleep_duration': qoqAvgSleepDuration,
        'qoq_sleep_score': qoqSleepScore,
        'qoq_sleep_evaluate': qoqSleepEvaluate,
        'sleep_trend_list': sleepTrendList?.map((e) => e.toJson()).toList(),
        'asleep_time_trend_list':
            asleepTimeTrendList?.map((e) => e.toJson()).toList(),
        'best_sleep_info': bestSleepInfo?.toJson(),
        'worst_sleep_info': worstSleepInfo?.toJson(),
        'earliest_sleep_info': earliestSleepInfo?.toJson(),
        'latest_sleep_info': latestSleepInfo?.toJson(),
        'hr_list': hrList?.map((e) => e.toJson()).toList(),
        'avg_hr': avgHr,
        'max_hr': maxHr,
        'min_hr': minHr,
        'sleep_target_duration': sleepTargetDuration,
      };
}

class SleepHrItem {
  SleepHrItem({this.time, this.value});

  factory SleepHrItem.fromJson(Map<String, dynamic> json) => SleepHrItem(
        time: json['date_time'] ??
            json['time'] ??
            json['time_key'] ??
            json['timestamp'],
        value: _parseNum(
          json['value'] ?? json['hr'] ?? json['heart_rate'] ?? json['bpm'],
        ),
      );

  Object? time;
  num? value;

  Map<String, dynamic> toJson() => {'time': time, 'value': value};
}

class LatestSleepInfo {
  LatestSleepInfo({this.timeKey, this.asleepTime});

  factory LatestSleepInfo.fromJson(Map<String, dynamic> json) =>
      LatestSleepInfo(
        timeKey: json['time_key'],
        asleepTime: _parseNum(json['asleep_time']),
      );

  Object? timeKey;
  num? asleepTime;

  Map<String, dynamic> toJson() =>
      {'time_key': timeKey, 'asleep_time': asleepTime};
}

class EarliestSleepInfo {
  EarliestSleepInfo({this.timeKey, this.asleepTime});

  factory EarliestSleepInfo.fromJson(Map<String, dynamic> json) =>
      EarliestSleepInfo(
        timeKey: json['time_key'],
        asleepTime: _parseNum(json['asleep_time']),
      );

  Object? timeKey;
  num? asleepTime;

  Map<String, dynamic> toJson() =>
      {'time_key': timeKey, 'asleep_time': asleepTime};
}

class WorstSleepInfo {
  WorstSleepInfo({this.timeKey, this.totalTime, this.score});

  factory WorstSleepInfo.fromJson(Map<String, dynamic> json) => WorstSleepInfo(
        timeKey: json['time_key'],
        totalTime: _parseNum(json['total_time']),
        score: _parseNum(json['score']),
      );

  Object? timeKey;
  num? totalTime;
  num? score;

  Map<String, dynamic> toJson() =>
      {'time_key': timeKey, 'total_time': totalTime, 'score': score};
}

class BestSleepInfo {
  BestSleepInfo({this.timeKey, this.totalTime, this.score});

  factory BestSleepInfo.fromJson(Map<String, dynamic> json) => BestSleepInfo(
        timeKey: json['time_key'],
        totalTime: _parseNum(json['total_time']),
        score: _parseNum(json['score']),
      );

  Object? timeKey;
  num? totalTime;
  num? score;

  Map<String, dynamic> toJson() =>
      {'time_key': timeKey, 'total_time': totalTime, 'score': score};
}

class AsleepTimeTrendList {
  AsleepTimeTrendList({this.timeKey, this.asleepTime});

  factory AsleepTimeTrendList.fromJson(Map<String, dynamic> json) =>
      AsleepTimeTrendList(
        timeKey: json['time_key'],
        asleepTime: _parseNum(json['asleep_time']),
      );

  Object? timeKey;
  num? asleepTime;

  Map<String, dynamic> toJson() =>
      {'time_key': timeKey, 'asleep_time': asleepTime};
}

class SleepTrendList {
  SleepTrendList({
    this.timeKey,
    this.totalTime,
    this.score,
    this.sleepEvaluate,
  });

  factory SleepTrendList.fromJson(Map<String, dynamic> json) => SleepTrendList(
        timeKey: json['time_key'],
        totalTime: _parseNum(json['total_time']),
        score: _parseNum(json['score']),
        sleepEvaluate: _parseNum(json['sleep_evaluate']),
      );

  Object? timeKey;
  num? totalTime;
  num? score;
  num? sleepEvaluate;

  Map<String, dynamic> toJson() => {
        'time_key': timeKey,
        'total_time': totalTime,
        'score': score,
        'sleep_evaluate': sleepEvaluate,
      };
}

num? _parseNum(Object? value) {
  if (value is num) return value;
  if (value is String) return num.tryParse(value);
  return null;
}

T? _parseMap<T>(Object? value, T Function(Map<String, dynamic>) convert) {
  if (value is! Map) return null;
  return convert(Map<String, dynamic>.from(value));
}

List<T>? _parseList<T>(
  Object? value,
  T Function(Map<String, dynamic>) convert,
) {
  if (value is! List) return null;
  return value
      .whereType<Map>()
      .map((item) => convert(Map<String, dynamic>.from(item)))
      .toList();
}