import 'package:posyandu/services/api_service.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; class ImunisasiService { final ApiService _apiService = ApiService(); // Singleton pattern static final ImunisasiService _instance = ImunisasiService._internal(); factory ImunisasiService() { return _instance; } ImunisasiService._internal(); /// Mendapatkan data anak berdasarkan ID Future> getAnakData(int anakId) async { try { final response = await _apiService.get('anak/$anakId'); // Print full response for debugging print('Full anak data response: $response'); if (response['success'] == true && response['data'] != null) { print('Berhasil mendapatkan data anak dengan ID $anakId'); return response['data']; } else { print('API mengembalikan status bukan success: ${response['success']}'); throw Exception(response['message'] ?? 'Data anak tidak ditemukan'); } } catch (e) { print('Error saat mengambil data anak: $e'); throw Exception('Data anak tidak ditemukan: $e'); } } /// Mendapatkan semua imunisasi Future> getAllImunisasi({Map? filters}) async { try { // Siapkan parameter query String endpoint = 'imunisasi'; // Tambahkan filter jika ada if (filters != null && filters.isNotEmpty) { List queryParams = []; filters.forEach((key, value) { if (value != null) { queryParams.add('$key=$value'); } }); if (queryParams.isNotEmpty) { endpoint = '$endpoint?${queryParams.join('&')}'; } } final response = await _apiService.get(endpoint); if (response['status'] == 'success') { final imunisasiList = response['data'] as List; print('Berhasil mendapatkan ${imunisasiList.length} data imunisasi dari API'); return imunisasiList; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal mendapatkan data imunisasi'); } } catch (e) { print('Error saat mengambil data imunisasi: $e'); return []; // Return empty list on error } } /// Mendapatkan imunisasi berdasarkan ID Future> getImunisasiById(int id) async { try { final response = await _apiService.get('imunisasi/$id'); if (response['status'] == 'success') { final imunisasi = response['data'] as Map; print('Berhasil mendapatkan data imunisasi dengan ID $id dari API'); return imunisasi; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal mendapatkan data imunisasi'); } } catch (e) { print('Error saat mengambil data imunisasi by ID: $e'); throw Exception('Gagal memuat data imunisasi: $e'); } } /// Mendapatkan imunisasi untuk anak tertentu Future> getImunisasiByAnakId(int anakId) async { try { final response = await _apiService.get('imunisasi/anak/$anakId'); if (response['status'] == 'success') { final imunisasiList = response['data'] as List; print('Berhasil mendapatkan ${imunisasiList.length} data imunisasi untuk anak $anakId dari API'); return imunisasiList; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal mendapatkan data imunisasi untuk anak'); } } catch (e) { print('Error saat mengambil data imunisasi untuk anak: $e'); return []; // Return empty list on error } } /// Mendapatkan jadwal imunisasi untuk anak berdasarkan usia Future> getJadwalForAnak(int anakId) async { try { final response = await _apiService.get('imunisasi/jadwal/anak/$anakId'); if (response['status'] == 'success') { final result = { 'data': response['data'] as List, 'anak': response['anak'] as Map }; print('Berhasil mendapatkan jadwal imunisasi untuk anak $anakId (usia ${response['anak']['umur_hari']} hari)'); return result; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal mendapatkan jadwal imunisasi untuk anak'); } } catch (e) { print('Error saat mengambil jadwal imunisasi untuk anak: $e'); return { 'data': [], 'anak': {} }; // Return empty data on error } } /// Mendapatkan jadwal imunisasi dengan status implementasi Future> getJadwalWithStatus({DateTime? startDate, DateTime? endDate}) async { try { String endpoint = 'imunisasi/jadwal/status'; // Tambahkan filter date range jika ada if (startDate != null && endDate != null) { final formatter = DateFormat('yyyy-MM-dd'); endpoint += '?start_date=${formatter.format(startDate)}&end_date=${formatter.format(endDate)}'; } final response = await _apiService.get(endpoint); if (response['status'] == 'success') { final jadwalList = response['data'] as List; print('Berhasil mendapatkan ${jadwalList.length} jadwal imunisasi dengan status dari API'); return jadwalList; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal mendapatkan jadwal imunisasi dengan status'); } } catch (e) { print('Error saat mengambil jadwal imunisasi dengan status: $e'); return []; // Return empty list on error } } /// Update status imunisasi Future> updateImunisasiStatus(int id, String status, {DateTime? tanggal}) async { try { Map data = {'status': status}; // Tambahkan tanggal jika ada if (tanggal != null) { final formatter = DateFormat('yyyy-MM-dd'); data['tanggal'] = formatter.format(tanggal); } final response = await _apiService.post('imunisasi/$id', data); if (response['status'] == 'success') { print('Berhasil memperbarui status imunisasi dengan ID $id menjadi $status'); return response['data']; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal memperbarui status imunisasi'); } } catch (e) { print('Error saat memperbarui status imunisasi: $e'); throw Exception('Gagal memperbarui status imunisasi: $e'); } } /// Mendaftarkan anak untuk jadwal imunisasi Future> registerForJadwal(int jadwalId, int anakId) async { try { Map data = { 'jadwal_imunisasi_id': jadwalId, 'anak_id': anakId }; final response = await _apiService.post('imunisasi/create-from-jadwal', data); if (response['status'] == 'success') { print('Berhasil mendaftarkan anak untuk jadwal imunisasi'); return response['data']; } else { print('API mengembalikan status bukan success: ${response['status']}'); throw Exception(response['message'] ?? 'Gagal mendaftarkan anak untuk jadwal imunisasi'); } } catch (e) { print('Error saat mendaftarkan anak untuk jadwal imunisasi: $e'); throw Exception('Gagal mendaftarkan anak untuk jadwal imunisasi: $e'); } } /// Mendapatkan anak yang eligible untuk jadwal imunisasi tertentu Future> getEligibleChildren(int jadwalId) async { try { final response = await _apiService.get('imunisasi/jadwal/$jadwalId/eligible-children'); if (response['success'] == true) { final children = response['data'] as List; print('Berhasil mendapatkan ${children.length} anak yang eligible untuk jadwal imunisasi $jadwalId'); return children; } else { print('API mengembalikan success bukan true: ${response['success']}'); throw Exception(response['message'] ?? 'Gagal mendapatkan anak yang eligible'); } } catch (e) { print('Error saat mengambil data anak yang eligible: $e'); return []; // Return empty list on error } } /// Memeriksa status implementasi jadwal Future> checkJadwalStatus(int jadwalId) async { try { final response = await _apiService.get('imunisasi/jadwal/$jadwalId/status'); if (response['success'] == true) { final data = response['data'][0] as Map; print('Berhasil mendapatkan status implementasi jadwal imunisasi $jadwalId'); return data; } else { print('API mengembalikan success bukan true: ${response['success']}'); throw Exception(response['message'] ?? 'Gagal memeriksa status implementasi jadwal'); } } catch (e) { print('Error saat memeriksa status implementasi jadwal: $e'); throw Exception('Gagal memeriksa status implementasi jadwal: $e'); } } /// Menandai jadwal sebagai complete dan mendaftarkan semua anak yang eligible Future> completeJadwal(int jadwalId) async { try { final response = await _apiService.post('imunisasi/jadwal/$jadwalId/complete', {}); if (response['success'] == true) { print('Berhasil menandai jadwal imunisasi $jadwalId sebagai selesai'); return response['data']; } else { print('API mengembalikan success bukan true: ${response['success']}'); throw Exception(response['message'] ?? 'Gagal menandai jadwal sebagai selesai'); } } catch (e) { print('Error saat menandai jadwal sebagai selesai: $e'); throw Exception('Gagal menandai jadwal sebagai selesai: $e'); } } /// Konversi status imunisasi dari API ke tampilan di UI String getStatusDisplay(String status) { switch (status.toLowerCase()) { case 'belum': return 'Belum'; case 'sudah_sesuai_jadwal': return 'Sudah (Sesuai Jadwal)'; case 'sudah_tidak_sesuai_jadwal': return 'Sudah (Tidak Sesuai Jadwal)'; case 'batal': return 'Batal'; default: return status; } } /// Mendapatkan warna untuk status imunisasi Color getStatusColor(String status) { switch (status.toLowerCase()) { case 'belum': return Colors.grey; case 'sudah_sesuai_jadwal': return Colors.green; case 'sudah_tidak_sesuai_jadwal': return Colors.orange; case 'batal': return Colors.red; default: return Colors.blue; } } /// Mendapatkan icon untuk status imunisasi IconData getStatusIcon(String status) { switch (status.toLowerCase()) { case 'belum': return Icons.schedule; case 'sudah_sesuai_jadwal': return Icons.check_circle; case 'sudah_tidak_sesuai_jadwal': return Icons.check_circle_outline; case 'batal': return Icons.cancel; default: return Icons.help; } } }