import 'package:diameter/models/log_meal.dart'; import 'package:diameter/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:parse_server_sdk_flutter/parse_server_sdk.dart'; import 'package:diameter/models/log_event.dart'; class LogEntry { late String? objectId; late DateTime time; late int? mgPerDl; late double? mmolPerL; late double? bolusGlucose; late int? delayedBolusDuration; // TODO: either rename this or all other fields using delayedBolusRate late double? delayedBolusRatio; late String? notes; late Future> events; late Future> endedEvents; late Future> meals; LogEntry(ParseObject object) { objectId = object.get('objectId'); time = object.get('time')!; mgPerDl = object.get('mgPerDl') != null ? object.get('mgPerDl')!.toInt() : null; mmolPerL = object.get('mmolPerL') != null ? object.get('mmolPerL')!.toDouble() : null; bolusGlucose = object.get('bolusGlucose') != null ? object.get('bolusGlucose')!.toDouble() : null; delayedBolusDuration = object.get('delayedBolusDuration') != null ? object.get('delayedBolusDuration')!.toInt() : null; delayedBolusRatio = object.get('delayedBolusRatio') != null ? object.get('delayedBolusRatio')!.toDouble() : null; events = LogEvent.fetchAllForLogEntry(this); endedEvents = LogEvent.fetchAllEndedByEntry(this); meals = LogMeal.fetchAllForLogEntry(this); notes = object.get('notes'); } static Future> fetchAllForRange(DateTimeRange range) async { QueryBuilder query = QueryBuilder(ParseObject('LogEntry')) ..whereGreaterThanOrEqualsTo('time', range.start) ..whereLessThanOrEqualTo('time', range.end); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return apiResponse.results! .map((e) => LogEntry(e as ParseObject)) .toList(); } else { return []; } } static Future> fetchAll() async { QueryBuilder query = QueryBuilder(ParseObject('LogEntry')); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return apiResponse.results! .map((e) => LogEntry(e as ParseObject)) .toList(); } else { return []; } } static Future get(String objectId) async { QueryBuilder query = QueryBuilder(ParseObject('LogEntry')) ..whereEqualTo('objectId', objectId); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return LogEntry(apiResponse.result.first); } } static Future save({ required DateTime time, int? mgPerDl, double? mmolPerL, double? bolusGlucose, int? delayedBolusDuration, double? delayedBolusRatio, String? notes, }) async { final logEntry = ParseObject('LogEntry') ..set('time', time) ..set('bolusGlucose', bolusGlucose) ..set('delayedBolusDuration', delayedBolusDuration) ..set('delayedBolusRatio', delayedBolusRatio) ..set('notes', notes); if (!(mgPerDl == null && mmolPerL == null)) { logEntry.set( 'mgPerDl', mgPerDl != null ? mgPerDl.round() : Utils.convertMmolPerLToMgPerDl(mmolPerL ?? 0)); logEntry.set( 'mmolPerL', mmolPerL != null ? mmolPerL * 100 : Utils.convertMgPerDlToMmolPerL(mgPerDl ?? 0) * 100); } await logEntry.save(); } static Future update( String objectId, { DateTime? time, int? mgPerDl, double? mmolPerL, double? bolusGlucose, int? delayedBolusDuration, double? delayedBolusRatio, String? notes, }) async { final logEntry = ParseObject('LogEntry'); if (time != null) { logEntry.set('time', time); } if (bolusGlucose != null) { logEntry.set('bolusGlucose', bolusGlucose); } if (delayedBolusDuration != null) { logEntry.set('delayedBolusDuration', delayedBolusDuration); } if (delayedBolusRatio != null) { logEntry.set('delayedBolusRatio', delayedBolusRatio); } if (notes != null) { logEntry.set('notes', notes); } if (!(mgPerDl == null && mmolPerL == null)) { logEntry.set( 'mgPerDl', mgPerDl != null ? mgPerDl.round() : Utils.convertMmolPerLToMgPerDl(mmolPerL ?? 0)); logEntry.set( 'mmolPerL', mmolPerL != null ? mmolPerL * 100 : Utils.convertMgPerDlToMmolPerL(mgPerDl ?? 0) * 100); } await logEntry.save(); } Future delete() async { var logEntry = ParseObject('LogEntry')..objectId = objectId; await logEntry.delete(); } }