import 'package:diameter/config.dart'; import 'package:diameter/settings.dart'; import 'package:diameter/utils/date_time_utils.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/components/data_table.dart'; import 'package:diameter/models/bolus_profile.dart'; class Bolus extends DataTableContent { late String? objectId; late DateTime startTime; late DateTime endTime; late double units; late double carbs; late int? mgPerDl; late double? mmolPerL; late String bolusProfile; Bolus(ParseObject? object) { if (object != null) { objectId = object.get('objectId'); startTime = object.get('startTime')!; endTime = object.get('endTime')!; units = object.get('units')! / 100; carbs = object.get('carbs')!.toDouble(); mgPerDl = object.get('mgPerDl') != null ? object.get('mgPerDl')!.toInt() : null; mmolPerL = object.get('mmolPerL') != null ? object.get('mmolPerL')! / 100 : null; bolusProfile = object.get('bolusProfile')!.get('objectId')!; } } static Future get(String objectId) async { QueryBuilder query = QueryBuilder(ParseObject('Bolus')) ..whereEqualTo('objectId', objectId); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return Bolus(apiResponse.result.first); } } static Future> fetchAllForBolusProfile( BolusProfile bolusProfile) async { QueryBuilder query = QueryBuilder(ParseObject('Bolus')) ..whereEqualTo( 'bolusProfile', (ParseObject('BolusProfile')..objectId = bolusProfile.objectId!) .toPointer()); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return apiResponse.results!.map((e) => Bolus(e as ParseObject)).toList(); } else { return []; } } static Future save({ required DateTime startTime, required DateTime endTime, required double units, required double carbs, int? mgPerDl, double? mmolPerL, required String bolusProfile, }) async { final bolus = ParseObject('Bolus') ..set('startTime', startTime) ..set('endTime', endTime) ..set('units', units * 100) ..set('carbs', carbs.round()) ..set('bolusProfile', (ParseObject('BolusProfile')..objectId = bolusProfile).toPointer()); bolus.set( 'mgPerDl', mgPerDl != null ? mgPerDl.round() : Utils.convertMmolPerLToMgPerDl(mmolPerL ?? 0)); bolus.set( 'mmolPerL', mmolPerL != null ? mmolPerL * 100 : Utils.convertMgPerDlToMmolPerL(mgPerDl ?? 0) * 100); await bolus.save(); } static Future update( String objectId, { DateTime? startTime, DateTime? endTime, double? units, double? carbs, int? mgPerDl, double? mmolPerL, }) async { var bolus = ParseObject('Bolus')..objectId = objectId; if (startTime != null) { bolus.set('startTime', startTime); } if (endTime != null) { bolus.set('endTime', endTime); } if (units != null) { bolus.set('units', units * 100); } if (carbs != null) { bolus.set('carbs', carbs); } if (mgPerDl != null || mmolPerL != null) { bolus.set( 'mgPerDl', mgPerDl != null ? mgPerDl.round() : Utils.convertMmolPerLToMgPerDl(mmolPerL ?? 0)); bolus.set( 'mmolPerL', mmolPerL != null ? mmolPerL * 100 : Utils.convertMgPerDlToMmolPerL(mgPerDl ?? 0) * 100); } await bolus.save(); } Future delete() async { var bolus = ParseObject('Bolus')..objectId = objectId; await bolus.delete(); } @override List asDataTableCells(List? actions) { var cols = [ DataCell(Text(DateTimeUtils.displayTime(startTime))), DataCell(Text(DateTimeUtils.displayTime(endTime))), DataCell(Text('${units.toString()} U')), DataCell(Text('${carbs.toString()} g')), ]; if (glucoseMeasurement == GlucoseMeasurement.mgPerDl || glucoseDisplayMode == GlucoseDisplayMode.both || glucoseDisplayMode == GlucoseDisplayMode.bothForList) { cols.add(DataCell(Text('${mgPerDl.toString()} mg/dl'))); } if (glucoseMeasurement == GlucoseMeasurement.mmolPerL || glucoseDisplayMode == GlucoseDisplayMode.both || glucoseDisplayMode == GlucoseDisplayMode.bothForList) { cols.add(DataCell(Text('${mmolPerL.toString()} mmol/l'))); } cols.add( DataCell( Row( children: actions ?? [], ), ), ); return cols; } static List asDataTableColumns() { var cols = [ const DataColumn(label: Expanded(child: Text('Start Time'))), const DataColumn(label: Expanded(child: Text('End Time'))), const DataColumn(label: Expanded(child: Text('Units'))), const DataColumn(label: Expanded(child: Text('per Carbs'))), ]; if (glucoseMeasurement == GlucoseMeasurement.mgPerDl || glucoseDisplayMode == GlucoseDisplayMode.both || glucoseDisplayMode == GlucoseDisplayMode.bothForList) { cols.add(const DataColumn(label: Expanded(child: Text('per mg/dl')))); } if (glucoseMeasurement == GlucoseMeasurement.mmolPerL || glucoseDisplayMode == GlucoseDisplayMode.both || glucoseDisplayMode == GlucoseDisplayMode.bothForList) { cols.add(const DataColumn(label: Expanded(child: Text('per mmol/l')))); } cols.add( const DataColumn(label: Expanded(child: Text('Actions'))), ); return cols; } }