class IntervalChartData {
final String label;
final double value;
final DateTime timestamp;
IntervalChartData({
required this.label,
required this.value,
required this.timestamp,
});
static Future<List<IntervalChartData>> fromHealth({
required List<HealthDataType> types,
required DateTime start,
required DateTime end,
required int interval,
}) async {
final data = await health.getHealthIntervalDataFromTypes(
startDate: start,
endDate: end,
types: types,
interval: interval,
);
return data.map((point) {
final value = (point.value as NumericHealthValue).numericValue.toDouble();
final label = _formatIntervalLabel(point.dateFrom, interval);
return IntervalChartData(
label: label,
value: value,
timestamp: point.dateFrom,
);
}).toList();
}
static String _formatIntervalLabel(DateTime date, int interval) {
if (interval == 86400) {
// Daily: "Mon", "Tue", etc.
return ['', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][date.weekday];
} else if (interval == 3600) {
// Hourly: "14:00", "15:00", etc.
return '${date.hour}:00';
} else if (interval >= 604800) {
// Weekly/monthly: "Jan 1", "Jan 8", etc.
return '${_monthName(date.month)} ${date.day}';
}
return date.toString();
}
static String _monthName(int month) {
return ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][month];
}
}