259 lines
7.8 KiB
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.',
|
|
};
|
|
}
|
|
}
|
|
}
|