pk_data.dart 1.36 KB
/// PK results are supplied by the caller; missing scores are not a draw.
enum PkResult { win, loss, draw }

class PkPlayer {
  const PkPlayer({
    required this.name,
    this.subtitle = '',
    this.avatarUrl,
    this.avatarAsset,
    this.score,
    this.steps,
    this.calories,
    this.standingHours,
    this.winningDays,
  });
  final String name;
  final String subtitle;
  final String? avatarUrl;
  final String? avatarAsset;
  final int? score, steps, calories, winningDays;
  final double? standingHours;
}

class PkDay {
  const PkDay(this.leftScore, this.rightScore);
  final int leftScore, rightScore;
  double get leftFraction =>
      leftScore + rightScore == 0 ? 0.5 : leftScore / (leftScore + rightScore);
}

class PkData {
  const PkData({
    required this.left,
    required this.right,
    required this.month,
    this.days = const {},
  });
  final PkPlayer left, right;
  final DateTime month;

  /// Day of month -> result. Missing days render as unrecorded.
  final Map<int, PkDay> days;
  PkResult? get result => compare(left.score, right.score);
  PkResult? get monthlyResult => compare(left.winningDays, right.winningDays);
  static PkResult? compare(int? left, int? right) {
    if (left == null || right == null) return null;
    return left > right
        ? PkResult.win
        : left < right
            ? PkResult.loss
            : PkResult.draw;
  }
}