import 'package:diameter/components/data_table.dart'; import 'package:diameter/models/log_entry.dart'; import 'package:diameter/models/log_event_type.dart'; import 'package:diameter/utils/date_time_utils.dart'; import 'package:flutter/material.dart'; import 'package:parse_server_sdk_flutter/parse_server_sdk.dart'; class LogEvent extends DataTableContent { late String? objectId; late String logEntry; late String? endLogEntry; late String eventType; late DateTime time; late DateTime? endTime; late bool hasEndTime; late String? notes; LogEvent(ParseObject? object) { if (object != null) { objectId = object.get('objectId'); logEntry = object.get('logEntry')!.get('objectId')!; endLogEntry = object.get('endLogEntry')?.get('objectId'); eventType = object.get('eventType')!.get('objectId')!; time = object.get('time')!; endTime = object.get('endTime'); hasEndTime = object.get('hasEndTime')!; notes = object.get('notes'); } } static Future get(String objectId) async { QueryBuilder query = QueryBuilder(ParseObject('LogEvent')) ..whereEqualTo('objectId', objectId); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return LogEvent(apiResponse.result.first); } } static Future> fetchAllActive() async { QueryBuilder query = QueryBuilder(ParseObject('LogEvent')) ..whereEqualTo('hasEndTime', true) ..whereEqualTo('endTime', null); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return apiResponse.results! .map((e) => LogEvent(e as ParseObject)) .toList(); } else { return []; } } static Future> fetchAllForLogEntry(LogEntry logEntry) async { QueryBuilder query = QueryBuilder( ParseObject('LogEvent')) ..whereEqualTo('logEntry', (ParseObject('LogEntry')..objectId = logEntry.objectId!).toPointer()); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return apiResponse.results! .map((e) => LogEvent(e as ParseObject)) .toList(); } else { return []; } } static Future> fetchAllEndedByEntry(LogEntry logEntry) async { QueryBuilder query = QueryBuilder( ParseObject('LogEvent')) ..whereEqualTo('endLogEntry', (ParseObject('LogEntry')..objectId = logEntry.objectId!).toPointer()); final ParseResponse apiResponse = await query.query(); if (apiResponse.success && apiResponse.results != null) { return apiResponse.results! .map((e) => LogEvent(e as ParseObject)) .toList(); } else { return []; } } static Future save({ required String logEntry, required String eventType, required DateTime time, required bool hasEndTime, String? notes, }) async { final logEvent = ParseObject('LogEvent') ..set('logEntry', (ParseObject('LogEntry')..objectId = logEntry).toPointer()) ..set('eventType', (ParseObject('LogEventType')..objectId = eventType).toPointer()) ..set('time', time) ..set('hasEndTime', hasEndTime) ..set('notes', notes); await logEvent.save(); } static Future update( String objectId, { String? eventType, String? endLogEntry, DateTime? time, DateTime? endTime, bool? hasEndTime, String? notes, }) async { var logEvent = ParseObject('LogEvent')..objectId = objectId; if (eventType != null) { logEvent.set('eventType', (ParseObject('LogEventType')..objectId = eventType).toPointer()); } if (endLogEntry != null) { logEvent.set('endLogEntry', (ParseObject('LogEntry')..objectId = endLogEntry).toPointer()); } if (time != null) { logEvent.set('time', time); } if (endTime != null) { logEvent.set('endTime', endTime); } if (hasEndTime != null) { logEvent.set('hasEndTime', hasEndTime); } if (notes != null) { logEvent.set('notes', notes); } await logEvent.save(); } Future delete() async { var logEvent = ParseObject('LogEvent')..objectId = objectId; await logEvent.delete(); } @override List asDataTableCells(List actions, {List? types}) { return [ DataCell(Text( types?.firstWhere((element) => element.objectId == eventType).value ?? types?.length.toString() ?? '')), DataCell(Text(DateTimeUtils.displayDateTime(time))), DataCell(Text(hasEndTime ? DateTimeUtils.displayDateTime(endTime, fallback: 'ongoing') : '-')), DataCell( Row( children: actions, ), ), ]; } static List asDataTableColumns() { return [ const DataColumn(label: Expanded(child: Text('Event Type'))), const DataColumn(label: Expanded(child: Text('Start Time'))), const DataColumn(label: Expanded(child: Text('End Time'))), const DataColumn(label: Expanded(child: Text('Actions'))), ]; } }