NIM_E31222534/Androidnya/lib/services/stunting_service.dart

259 lines
7.8 KiB
Dart

import 'package:posyandu/services/api_service.dart';
import 'package:posyandu/models/stunting_model.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';
class StuntingService {
final ApiService _apiService = ApiService();
// Singleton pattern
static final StuntingService _instance = StuntingService._internal();
factory StuntingService() {
return _instance;
}
StuntingService._internal();
/// Mendapatkan seluruh data stunting untuk anak tertentu
Future<List<StuntingData>> getStuntingByAnakId(int anakId) async {
try {
final response = await _apiService.get('stunting/anak/$anakId');
if (response['status'] == 'success' && response['stunting'] is List) {
try {
final stuntingList = List<StuntingData>.from(
response['stunting'].map((data) {
try {
return StuntingData.fromJson(data);
} catch (e) {
print('Error parsing individual stunting data: $e');
return null;
}
}).where((item) => item != null)
);
print('Berhasil mendapatkan ${stuntingList.length} data stunting untuk anak $anakId');
return stuntingList;
} catch (parseError) {
print('Error saat parsing data stunting: $parseError');
return [];
}
} else {
print('API mengembalikan status bukan success atau data stunting bukan List');
return [];
}
} catch (e) {
print('Error saat mengambil data stunting: $e');
return [];
}
}
/// Mendapatkan detail stunting berdasarkan ID
Future<StuntingData?> getStuntingById(int id) async {
try {
final response = await _apiService.get('stunting/$id');
if (response['status'] == 'success' && response['stunting'] != null) {
try {
return StuntingData.fromJson(response['stunting']);
} catch (parseError) {
print('Error saat parsing data stunting: $parseError');
return null;
}
} else {
print('API mengembalikan status bukan success atau data stunting null');
return null;
}
} catch (e) {
print('Error saat mengambil detail stunting: $e');
return null;
}
}
/// Menghitung status stunting berdasarkan usia, tinggi dan berat
Future<Map<String, dynamic>> calculateStuntingStatus({
required String usia,
required double tinggiBadan,
required double beratBadan,
}) async {
try {
final requestData = {
'usia': usia,
'tinggi_badan': tinggiBadan,
'berat_badan': beratBadan,
};
final response = await _apiService.post('stunting/calculate', requestData);
if (response['status'] == 'success') {
return {
'success': true,
'usiaBulan': response['usia_bulan'],
'tinggiBadan': response['tinggi_badan'],
'beratBadan': response['berat_badan'],
'statusByHeight': response['status_by_height'],
'statusByWeight': response['status_by_weight'],
'finalStatus': response['final_status'],
};
} else {
print('API mengembalikan error: ${response['message']}');
return {
'success': false,
'message': response['message'] ?? 'Gagal menghitung status stunting',
};
}
} catch (e) {
print('Error saat menghitung status stunting: $e');
return {
'success': false,
'message': 'Terjadi kesalahan: $e',
};
}
}
/// Menyimpan data stunting baru
Future<Map<String, dynamic>> createStuntingData({
required int anakId,
required String tanggal,
required String usia,
required int perkembanganId,
String? catatan,
String? status,
}) async {
try {
final requestData = {
'anak_id': anakId,
'tanggal': tanggal,
'usia': usia,
'perkembangan_id': perkembanganId,
'catatan': catatan,
'status': status,
};
// Remove null values
requestData.removeWhere((key, value) => value == null);
final response = await _apiService.post('stunting', requestData);
if (response['status'] == 'success') {
return {
'success': true,
'message': response['message'] ?? 'Data stunting berhasil ditambahkan',
'stunting': response['stunting'],
'calculatedStatus': response['calculated_status'],
};
} else {
print('API mengembalikan error: ${response['message']}');
return {
'success': false,
'message': response['message'] ?? 'Gagal menambahkan data stunting',
};
}
} catch (e) {
print('Error saat menambahkan data stunting: $e');
return {
'success': false,
'message': 'Terjadi kesalahan: $e',
};
}
}
/// Memperbarui data stunting
Future<Map<String, dynamic>> updateStuntingData({
required int id,
required String tanggal,
required String usia,
required int perkembanganId,
String? catatan,
String? status,
}) async {
try {
final requestData = {
'tanggal': tanggal,
'usia': usia,
'perkembangan_id': perkembanganId,
'catatan': catatan,
'status': status,
};
// Remove null values
requestData.removeWhere((key, value) => value == null);
final response = await _apiService.put('stunting/$id', requestData);
if (response['status'] == 'success') {
return {
'success': true,
'message': response['message'] ?? 'Data stunting berhasil diperbarui',
'stunting': response['stunting'],
'calculatedStatus': response['calculated_status'],
};
} else {
print('API mengembalikan error: ${response['message']}');
return {
'success': false,
'message': response['message'] ?? 'Gagal memperbarui data stunting',
};
}
} catch (e) {
print('Error saat memperbarui data stunting: $e');
return {
'success': false,
'message': 'Terjadi kesalahan: $e',
};
}
}
/// Menghapus data stunting
Future<Map<String, dynamic>> deleteStunting(int id) async {
try {
final response = await _apiService.delete('stunting/$id');
if (response['status'] == 'success') {
return {
'success': true,
'message': response['message'] ?? 'Data stunting berhasil dihapus',
};
} else {
print('API mengembalikan error: ${response['message']}');
return {
'success': false,
'message': response['message'] ?? 'Gagal menghapus data stunting',
};
}
} catch (e) {
print('Error saat menghapus data stunting: $e');
return {
'success': false,
'message': 'Terjadi kesalahan: $e',
};
}
}
/// Get status stunting details (icon, color, message)
Map<String, dynamic> getStatusDetails(String status) {
switch (status.toLowerCase()) {
case 'stunting':
return {
'color': 0xFFE53935, // Colors.red[600]
'icon': 'warning',
'message': 'Anak terdeteksi stunting. Segera konsultasi dengan dokter atau petugas kesehatan.',
};
case 'resiko stunting':
case 'risiko stunting':
return {
'color': 0xFFFF9800, // Colors.orange
'icon': 'warning_amber',
'message': 'Anak berisiko stunting. Tingkatkan asupan gizi dan lakukan pemeriksaan rutin.',
};
case 'tidak stunting':
default:
return {
'color': 0xFF4CAF50, // Colors.green
'icon': 'check_circle',
'message': 'Anak memiliki tinggi badan dan berat badan normal sesuai usia. Pertahankan asupan gizi seimbang.',
};
}
}
}