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> 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.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 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> 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> 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> 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> 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 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.', }; } } }