environment_monitoring_app/lib/services/marine_api_service.dart

196 lines
7.6 KiB
Dart

// lib/services/marine_api_service.dart
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
import 'package:environment_monitoring_app/services/base_api_service.dart';
import 'package:environment_monitoring_app/services/telegram_service.dart';
import 'package:environment_monitoring_app/services/server_config_service.dart';
import 'package:environment_monitoring_app/services/api_service.dart'; // For imageBaseUrl
// --- ADDED: Imports for data models ---
import 'package:environment_monitoring_app/models/marine_manual_pre_departure_checklist_data.dart';
import 'package:environment_monitoring_app/models/marine_manual_sonde_calibration_data.dart';
import 'package:environment_monitoring_app/models/marine_manual_equipment_maintenance_data.dart';
class MarineApiService {
final BaseApiService _baseService;
final TelegramService _telegramService;
final ServerConfigService _serverConfigService;
MarineApiService(this._baseService, this._telegramService, this._serverConfigService);
// --- METHODS YOU ALREADY MOVED ---
Future<Map<String, dynamic>> getTarballStations() async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.get(baseUrl, 'marine/tarball/stations');
}
Future<Map<String, dynamic>> getManualStations() async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.get(baseUrl, 'marine/manual/stations');
}
Future<Map<String, dynamic>> getTarballClassifications() async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.get(baseUrl, 'marine/tarball/classifications');
}
Future<Map<String, dynamic>> getManualSamplingImages({
required int stationId,
required DateTime samplingDate,
required String samplingType, // This parameter is now used
}) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
final String dateStr = DateFormat('yyyy-MM-dd').format(samplingDate);
String endpoint;
switch (samplingType) {
case 'In-Situ Sampling':
endpoint = 'marine/manual/records-by-station?station_id=$stationId&date=$dateStr';
break;
case 'Tarball Sampling':
endpoint = 'marine/tarball/records-by-station?station_id=$stationId&date=$dateStr';
break;
case 'All Manual Sampling':
default:
endpoint = 'marine/manual/records-by-station?station_id=$stationId&date=$dateStr';
break;
}
debugPrint("MarineApiService: Calling API endpoint: $endpoint");
final response = await _baseService.get(baseUrl, endpoint);
if (response['success'] == true && response['data'] is Map && response['data']['data'] is List) {
return {
'success': true,
'data': response['data']['data'], // Return the inner 'data' list
'message': response['message'],
};
}
return response;
}
Future<Map<String, dynamic>> sendImageRequestEmail({
required String recipientEmail,
required List<String> imageUrls,
required String stationName,
required String samplingDate,
}) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
final Map<String, String> fields = {
'recipientEmail': recipientEmail,
'imageUrls': jsonEncode(imageUrls),
'stationName': stationName,
'samplingDate': samplingDate,
};
return _baseService.postMultipart(
baseUrl: baseUrl,
endpoint: 'marine/images/send-email',
fields: fields,
files: {},
);
}
// --- START: ADDED MISSING METHODS ---
Future<Map<String, dynamic>> submitPreDepartureChecklist(MarineManualPreDepartureChecklistData data) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.post(baseUrl, 'marine/checklist', data.toApiFormData());
}
Future<Map<String, dynamic>> submitSondeCalibration(MarineManualSondeCalibrationData data) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.post(baseUrl, 'marine/calibration', data.toApiFormData());
}
Future<Map<String, dynamic>> submitMaintenanceLog(MarineManualEquipmentMaintenanceData data) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.post(baseUrl, 'marine/maintenance', data.toApiFormData());
}
Future<Map<String, dynamic>> getPreviousMaintenanceLogs() async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
return _baseService.get(baseUrl, 'marine/maintenance/previous');
}
// --- END: ADDED MISSING METHODS ---
// *** START: ADDED FOR NPE REPORTS ***
/// Fetches all NPE Reports submitted by the user (requires auth).
Future<Map<String, dynamic>> getAllNpeReports() async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
// Corresponds to the new GET /marine/npe route in index.php
final response = await _baseService.get(baseUrl, 'marine/npe');
// Assuming the response returns the array of reports directly under the 'data' key
if (response['success'] == true && response['data'] is List) {
return response;
}
// Handle error or empty response
if (response['success'] == true && response['data'] == null) {
return {'success': true, 'data': [], 'message': 'No reports found.'};
}
return response;
}
// *** END: ADDED FOR NPE REPORTS ***
// *** START: ADDED FOR INVESTIGATIVE IMAGE REQUEST ***
/// Fetches investigative sampling records based on station and date.
/// This will check against investigative logs which could have used either a manual or tarball station.
Future<Map<String, dynamic>> getInvestigativeSamplingImages({
required int stationId,
required DateTime samplingDate,
required String stationType, // 'Existing Manual Station' or 'Existing Tarball Station'
}) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
final String dateStr = DateFormat('yyyy-MM-dd').format(samplingDate);
// Pass the station type to the API so it knows which foreign key to check (station_id vs tbl_station_id)
final String stationTypeParam = Uri.encodeComponent(stationType);
final String endpoint =
'marine/investigative/records-by-station?station_id=$stationId&date=$dateStr&station_type=$stationTypeParam';
debugPrint("MarineApiService: Calling API endpoint: $endpoint");
final response = await _baseService.get(baseUrl, endpoint);
// Assuming the response structure is the same as the manual/tarball endpoints
if (response['success'] == true && response['data'] is Map && response['data']['data'] is List) {
return {
'success': true,
'data': response['data']['data'], // Return the inner 'data' list
'message': response['message'],
};
}
return response;
}
/// Sends an email request for investigative images.
Future<Map<String, dynamic>> sendInvestigativeImageRequestEmail({
required String recipientEmail,
required List<String> imageUrls,
required String stationName,
required String samplingDate,
}) async {
final baseUrl = await _serverConfigService.getActiveApiUrl();
final Map<String, String> fields = {
'recipientEmail': recipientEmail,
'imageUrls': jsonEncode(imageUrls),
'stationName': stationName,
'samplingDate': samplingDate,
};
// Use a new endpoint dedicated to the investigative module
return _baseService.postMultipart(
baseUrl: baseUrl,
endpoint: 'marine/investigative/images/send-email',
fields: fields,
files: {},
);
}
// *** END: ADDED FOR INVESTIGATIVE IMAGE REQUEST ***
}