import 'package:posyandu/models/profile_model.dart'; import 'package:posyandu/services/api_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; class ProfileService { final ApiService _apiService = ApiService(); Future getProfile() async { try { final response = await _apiService.get('profile'); return ProfileModel.fromJson(response); } catch (e) { print('Failed to load profile from API: $e'); // Fallback to SharedPreferences data try { final prefs = await SharedPreferences.getInstance(); final Map userData = { 'id': prefs.getInt('user_id') ?? 0, 'nik': prefs.getString('nik') ?? '', 'nama': prefs.getString('nama_ibu') ?? 'User', 'alamat': prefs.getString('alamat') ?? '', 'usia': prefs.getInt('usia') ?? 0, 'no_telp': prefs.getString('no_telp') ?? '', 'email': prefs.getString('email') ?? '', }; print('Using profile data from SharedPreferences: $userData'); return ProfileModel.fromJson(userData); } catch (prefError) { print('Error accessing SharedPreferences: $prefError'); throw Exception('Failed to load profile: $e'); } } } Future updateProfile(ProfileModel profile) async { try { // Get current user data first to ensure we have the correct ID final currentUser = await _apiService.get('user'); if (currentUser['status'] != 'success' || currentUser['pengguna'] == null) { throw Exception('Failed to get current user data'); } final userId = currentUser['pengguna']['id']; if (userId == null) { throw Exception('User ID not found in API response'); } print('Updating profile for user ID: $userId'); // Create update payload with correct field names final updateData = { 'nama_ibu': profile.name, 'email': profile.email, 'no_telp': profile.phone, 'alamat': profile.address, 'nik': profile.nik, }; // Call the API endpoint with ID from API response final response = await _apiService.put('user/$userId', updateData); // If successful, update local storage if (response['status'] == 'success' && response['pengguna'] != null) { final userData = response['pengguna']; final prefs = await SharedPreferences.getInstance(); await prefs.setString('nama_ibu', userData['nama_ibu'] ?? ''); await prefs.setString('email', userData['email'] ?? ''); await prefs.setString('no_telp', userData['no_telp'] ?? ''); await prefs.setString('alamat', userData['alamat'] ?? ''); await prefs.setString('nik', userData['nik'] ?? ''); await prefs.setInt('user_id', userId); // Update stored user ID } else { throw Exception(response['message'] ?? 'Failed to update profile'); } } catch (e) { print('Error updating profile: $e'); throw Exception('Failed to update profile: $e'); } } Future> getChildren({required int userId}) async { try { print('Fetching children for user ID: $userId'); // Clear any cached data first _apiService.clearChildCache(); // Try first endpoint try { final response = await _apiService.get('anak/orangtua/$userId'); if (response.containsKey('data') && response['data'] is List) { final children = response['data'] as List; print('Found ${children.length} children via anak/orangtua endpoint'); // Verifikasi bahwa jumlah anak masuk akal if (children.length > 0 && children.length <= 10) { return children; } else if (children.length > 10) { print('Unreasonably high number of children (${children.length}), limiting to first 3'); return children.take(3).toList(); } return children; } } catch (e) { print('First endpoint failed: $e'); } // Try second endpoint try { final response = await _apiService.get('anak'); if (response.containsKey('data') && response['data'] is List) { List allChildren = response['data'] as List; // Jika array kosong, langsung kembalikan array kosong if (allChildren.isEmpty) { print('API returned empty children array'); return []; } List userChildren = allChildren.where((child) => (child['id_orangtua'] == userId || child['id_ortu'] == userId) ).toList(); print('Found ${userChildren.length} children via anak endpoint with filtering'); // Verifikasi bahwa jumlah anak masuk akal if (userChildren.length > 0 && userChildren.length <= 10) { return userChildren; } else if (userChildren.length > 10) { print('Unreasonably high number of filtered children (${userChildren.length}), limiting to first 3'); return userChildren.take(3).toList(); } if (userChildren.isNotEmpty) { return userChildren; } } } catch (e) { print('Second endpoint failed: $e'); } // Try third endpoint without filtering (for testing) try { final response = await _apiService.get('anak'); if (response.containsKey('data') && response['data'] is List) { List allChildren = response['data'] as List; // Jika array kosong dari API, kembalikan array kosong if (allChildren.isEmpty) { print('API returned empty children array (unfiltered)'); return []; } print('Found ${allChildren.length} total children via anak endpoint without filtering'); // Verifikasi bahwa jumlah anak masuk akal if (allChildren.length > 10) { print('Unreasonably high number of all children (${allChildren.length}), limiting to first 3'); return allChildren.take(3).toList(); } // For testing, return all children regardless of parent return allChildren; } } catch (e) { print('Third endpoint failed: $e'); } // Return last resort dummy data only if everything else fails print('All API endpoints failed - returning dummy data for testing'); return [ { 'id': 999, 'nama': 'Data Dummy - API Error', 'jenis_kelamin': 'Laki-laki', 'usia_bulan': 24 } ]; } catch (e) { print('Error in getChildren method: $e'); // Return minimal dummy data return [ { 'id': 888, 'nama': 'Error Data', 'jenis_kelamin': 'Laki-laki', 'usia_bulan': 1 } ]; } } Future logout() async { try { await _apiService.post('auth/logout', {}); } catch (e) { throw Exception('Failed to logout: $e'); } } }