import 'package:get/get.dart'; import 'package:logger/logger.dart'; import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/model/attendance_model.dart'; import 'package:marco/model/project_model.dart'; import 'package:marco/model/employee_model.dart'; final Logger log = Logger(); class EmployeesScreenController extends GetxController { List attendances = []; List projects = []; String? selectedProjectId; List employees = []; RxBool isLoading = false.obs; RxMap uploadingStates = {}.obs; @override void onInit() { super.onInit(); fetchAllProjects(); } Future fetchAllProjects() async { isLoading.value = true; await _handleApiCall( ApiService.getProjects, onSuccess: (data) { projects = data.map((json) => ProjectModel.fromJson(json)).toList(); log.i("Projects fetched: ${projects.length} projects loaded."); }, onEmpty: () => log.w("No project data found or API call failed."), ); isLoading.value = false; update(); } Future fetchAllEmployees() async { isLoading.value = true; await _handleApiCall( ApiService.getAllEmployees, onSuccess: (data) { employees = data.map((json) => EmployeeModel.fromJson(json)).toList(); log.i("All Employees fetched: ${employees.length} employees loaded."); }, onEmpty: () => log.w("No Employee data found or API call failed."), ); isLoading.value = false; update(); } Future fetchEmployeesByProject(String? projectId) async { if (projectId == null || projectId.isEmpty) { log.e("Project ID is required but was null or empty."); return; } isLoading.value = true; await _handleApiCall( () => ApiService.getAllEmployeesByProject(projectId), onSuccess: (data) { employees = data.map((json) => EmployeeModel.fromJson(json)).toList(); for (var emp in employees) { uploadingStates[emp.id] = false.obs; } log.i("Employees fetched: ${employees.length} for project $projectId"); update(); }, onEmpty: () { log.w("No employees found for project $projectId."); employees = []; update(); }, onError: (e) => log.e("Error fetching employees for project $projectId: $e"), ); isLoading.value = false; } Future _handleApiCall( Future?> Function() apiCall, { required Function(List) onSuccess, required Function() onEmpty, Function(dynamic error)? onError, }) async { try { final response = await apiCall(); if (response != null && response.isNotEmpty) { onSuccess(response); } else { onEmpty(); } } catch (e) { if (onError != null) { onError(e); } else { log.e("API call error: $e"); } } } }