import 'package:diameter/config.dart'; import 'package:diameter/main.dart'; import 'package:diameter/models/bolus_profile.dart'; import 'package:diameter/objectbox.g.dart'; import 'package:diameter/utils/date_time_utils.dart'; import 'package:flutter/material.dart'; // ignore: unnecessary_import import 'package:objectbox/objectbox.dart'; @Entity(uid: 3417770529060202389) class Bolus { static final Box box = objectBox.store.box(); int id; @Property(type: PropertyType.date) DateTime startTime; @Property(type: PropertyType.date) DateTime endTime; double units; double carbs; int? mgPerDl; double? mmolPerL; final bolusProfile = ToOne(); Bolus({ this.id = 0, required this.startTime, required this.endTime, this.units = 0, this.carbs = 0, this.mgPerDl, this.mmolPerL, }); static Bolus? get(int id) => box.get(id); static void put(Bolus bolus) => box.put(bolus); static void remove(int id) => box.remove(id); static List getAllForProfile(int id) { QueryBuilder builder = box.query()..order(Bolus_.startTime); builder.link(Bolus_.bolusProfile, BolusProfile_.id.equals(id)); return builder.build().find(); } static Bolus? getRateForTime(DateTime? dateTime) { if (dateTime != null) { // ignore: todo // TODO: check if an event is active that would change the active profile final bolusProfile = BolusProfile.getActive(); final time = DateTimeUtils.convertTimeOfDayToDateTime( TimeOfDay.fromDateTime(dateTime)); if (bolusProfile != null) { final rates = Bolus.getAllForProfile(bolusProfile.id); final result = rates.where((rate) { DateTime endTime = rate.endTime == dummyDate ? rate.endTime.add(const Duration(days: 1)) : rate.endTime; return (time.isAfter(rate.startTime) || time.isAtSameMomentAs(rate.startTime)) && time.isBefore(endTime); }); return result.length != 1 ? null : result.single; } return null; } } }