import 'dart:io'; import 'dart:convert'; // Added for jsonEncode import 'air_installation_data.dart'; class AirCollectionData { // Link to the original installation String? installationRefID; int? airManId; // The ID from the server database // Collection Info String? collectionDate; String? collectionTime; String? weather; double? temperature; String? powerFailure; // PM10 Readings double? pm10Flowrate; String? pm10FlowrateResult; String? pm10TotalTime; String? pm10TotalTimeResult; double? pm10Pressure; String? pm10PressureResult; double? pm10Vstd; // PM2.5 Readings double? pm25Flowrate; String? pm25FlowrateResult; String? pm25TotalTime; String? pm25TotalTimeResult; double? pm25Pressure; String? pm25PressureResult; double? pm25Vstd; // General String? remarks; int? collectionUserId; String? collectionUserName; // To hold the user's name for alerts String? status; // Image Files for Collection File? imageFront; File? imageBack; File? imageLeft; File? imageRight; File? imageChart; File? imageFilterPaper; File? optionalImage1; File? optionalImage2; File? optionalImage3; File? optionalImage4; String? optionalRemark1; String? optionalRemark2; String? optionalRemark3; String? optionalRemark4; AirCollectionData({ this.installationRefID, this.airManId, this.collectionDate, this.collectionTime, this.weather, this.temperature, this.powerFailure, this.pm10Flowrate, this.pm10FlowrateResult, this.pm10TotalTime, this.pm10TotalTimeResult, this.pm10Pressure, this.pm10PressureResult, this.pm10Vstd, this.pm25Flowrate, this.pm25FlowrateResult, this.pm25TotalTime, this.pm25TotalTimeResult, this.pm25Pressure, this.pm25PressureResult, this.pm25Vstd, this.remarks, this.collectionUserId, this.collectionUserName, this.status, this.imageFront, this.imageBack, this.imageLeft, this.imageRight, this.imageChart, this.imageFilterPaper, this.optionalImage1, this.optionalImage2, this.optionalImage3, this.optionalImage4, this.optionalRemark1, this.optionalRemark2, this.optionalRemark3, this.optionalRemark4, }); String generateCollectionTelegramAlert(AirInstallationData installationData, {required bool isDataOnly}) { final submissionType = isDataOnly ? "(Data Only)" : "(Data & Images)"; final buffer = StringBuffer() ..writeln('✅ *Air Manual Collection $submissionType Submitted:*') ..writeln() ..writeln('*Station ID:* ${installationData.stationID ?? 'N/A'}') ..writeln('*Location:* ${installationData.locationName ?? 'N/A'}') ..writeln('*Collection Date:* ${collectionDate ?? 'N/A'} at ${collectionTime ?? 'N/A'}') ..writeln('*Submitted by User:* ${collectionUserName ?? 'N/A'}') ..writeln('*Status of Submission:* Successful'); return buffer.toString(); } factory AirCollectionData.fromMap(Map map) { File? fileFromPath(String? path) => path != null ? File(path) : null; double? parseDouble(dynamic value) { if (value is double) return value; if (value is int) return value.toDouble(); if (value is String) return double.tryParse(value); return null; } return AirCollectionData( installationRefID: map['installationRefID'], airManId: map['air_man_id'], collectionDate: map['air_man_collection_date'], collectionTime: map['air_man_collection_time'], weather: map['air_man_collection_weather'], temperature: parseDouble(map['air_man_collection_temperature']), powerFailure: map['air_man_collection_power_failure'], pm10Flowrate: parseDouble(map['air_man_collection_pm10_flowrate']), pm10FlowrateResult: map['air_man_collection_pm10_flowrate_result'], pm10TotalTime: map['air_man_collection_pm10_total_time'], pm10TotalTimeResult: map['air_man_collection_total_time_result'], pm10Pressure: parseDouble(map['air_man_collection_pm10_pressure']), pm10PressureResult: map['air_man_collection_pm10_pressure_result'], pm10Vstd: parseDouble(map['air_man_collection_pm10_vstd']), pm25Flowrate: parseDouble(map['air_man_collection_pm25_flowrate']), pm25FlowrateResult: map['air_man_collection_pm25_flowrate_result'], pm25TotalTime: map['air_man_collection_pm25_total_time'], pm25TotalTimeResult: map['air_man_collection_pm25_total_time_result'], pm25Pressure: parseDouble(map['air_man_collection_pm25_pressure']), pm25PressureResult: map['air_man_collection_pm25_pressure_result'], pm25Vstd: parseDouble(map['air_man_collection_pm25_vstd']), remarks: map['air_man_collection_remarks'], collectionUserName: map['collectionUserName'], status: map['status'], optionalRemark1: map['optionalRemark1'], optionalRemark2: map['optionalRemark2'], optionalRemark3: map['optionalRemark3'], optionalRemark4: map['optionalRemark4'], imageFront: fileFromPath(map['imageFrontPath']), imageBack: fileFromPath(map['imageBackPath']), imageLeft: fileFromPath(map['imageLeftPath']), imageRight: fileFromPath(map['imageRightPath']), imageChart: fileFromPath(map['imageChartPath']), imageFilterPaper: fileFromPath(map['imageFilterPaperPath']), optionalImage1: fileFromPath(map['optionalImage1Path']), optionalImage2: fileFromPath(map['optionalImage2Path']), optionalImage3: fileFromPath(map['optionalImage3Path']), optionalImage4: fileFromPath(map['optionalImage4Path']), ); } Map toMap() { return { 'installationRefID': installationRefID, 'air_man_id': airManId, 'air_man_collection_date': collectionDate, 'air_man_collection_time': collectionTime, 'air_man_collection_weather': weather, 'air_man_collection_temperature': temperature, 'air_man_collection_power_failure': powerFailure, 'air_man_collection_pm10_flowrate': pm10Flowrate, 'air_man_collection_pm10_flowrate_result': pm10FlowrateResult, 'air_man_collection_pm10_total_time': pm10TotalTime, 'air_man_collection_total_time_result': pm10TotalTimeResult, 'air_man_collection_pm10_pressure': pm10Pressure, 'air_man_collection_pm10_pressure_result': pm10PressureResult, 'air_man_collection_pm10_vstd': pm10Vstd, 'air_man_collection_pm25_flowrate': pm25Flowrate, 'air_man_collection_pm25_flowrate_result': pm25FlowrateResult, 'air_man_collection_pm25_total_time': pm25TotalTime, 'air_man_collection_pm25_total_time_result': pm25TotalTimeResult, 'air_man_collection_pm25_pressure': pm25Pressure, 'air_man_collection_pm25_pressure_result': pm25PressureResult, 'air_man_collection_pm25_vstd': pm25Vstd, 'air_man_collection_remarks': remarks, 'collectionUserName': collectionUserName, 'status': status, 'optionalRemark1': optionalRemark1, 'optionalRemark2': optionalRemark2, 'optionalRemark3': optionalRemark3, 'optionalRemark4': optionalRemark4, 'imageFront': imageFront, 'imageBack': imageBack, 'imageLeft': imageLeft, 'imageRight': imageRight, 'imageChart': imageChart, 'imageFilterPaper': imageFilterPaper, 'optionalImage1': optionalImage1, 'optionalImage2': optionalImage2, 'optionalImage3': optionalImage3, 'optionalImage4': optionalImage4, }; } Map toJson() { return { 'air_man_id': airManId?.toString(), 'air_man_collection_user_id': collectionUserId?.toString(), 'air_man_collection_date': collectionDate, 'air_man_collection_time': collectionTime, 'air_man_collection_weather': weather, 'air_man_collection_temperature': temperature?.toString(), 'air_man_collection_power_failure': powerFailure, 'air_man_collection_pm10_flowrate': pm10Flowrate?.toString(), 'air_man_collection_pm10_flowrate_result': pm10FlowrateResult, 'air_man_collection_pm10_total_time': pm10TotalTime, 'air_man_collection_total_time_result': pm10TotalTimeResult, 'air_man_collection_pm10_pressure': pm10Pressure?.toString(), 'air_man_collection_pm10_pressure_result': pm10PressureResult, 'air_man_collection_pm10_vstd': pm10Vstd?.toString(), 'air_man_collection_pm25_flowrate': pm25Flowrate?.toString(), 'air_man_collection_pm25_flowrate_result': pm25FlowrateResult, 'air_man_collection_pm25_total_time': pm25TotalTime, 'air_man_collection_pm25_total_time_result': pm25TotalTimeResult, 'air_man_collection_pm25_pressure': pm25Pressure?.toString(), 'air_man_collection_pm25_pressure_result': pm25PressureResult, 'air_man_collection_pm25_vstd': pm25Vstd?.toString(), 'air_man_collection_remarks': remarks, 'air_man_collection_image_optional_01_remarks': optionalRemark1, 'air_man_collection_image_optional_02_remarks': optionalRemark2, 'air_man_collection_image_optional_03_remarks': optionalRemark3, 'air_man_collection_image_optional_04_remarks': optionalRemark4, }; } Map getImagesForUpload() { final Map files = {}; if (imageFront != null) files['front'] = imageFront!; if (imageBack != null) files['back'] = imageBack!; if (imageLeft != null) files['left'] = imageLeft!; if (imageRight != null) files['right'] = imageRight!; if (imageChart != null) files['chart'] = imageChart!; if (imageFilterPaper != null) files['filter_paper'] = imageFilterPaper!; if (optionalImage1 != null) files['optional_01'] = optionalImage1!; if (optionalImage2 != null) files['optional_02'] = optionalImage2!; if (optionalImage3 != null) files['optional_03'] = optionalImage3!; if (optionalImage4 != null) files['optional_04'] = optionalImage4!; return files; } }