VisitStats.of constructor
Counts stays over the days calendar days that end with now's.
Implementation
factory VisitStats.of(List<Stay> stays, DateTime now, {int days = 14}) {
// Calendar dates as UTC midnights, so a daylight-saving day still counts as one.
DateTime date(DateTime t) => DateTime.utc(t.year, t.month, t.day);
final today = date(now);
final perDay = List<int>.filled(days, 0);
final perHour = List<int>.filled(24, 0);
var stayed = Duration.zero;
var left = 0;
for (final stay in stays) {
final back = today.difference(date(stay.arrived)).inDays;
if (back < 0 || back >= days) {
continue;
}
perDay[days - 1 - back]++;
perHour[stay.arrived.hour]++;
if (stay.stayed case final s?) {
stayed += s;
left++;
}
}
return VisitStats._(
days: days,
perDay: perDay,
perHour: perHour,
averageStay: left == 0 ? null : stayed ~/ left,
);
}