import 'package:image_picker/image_picker.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/model/attendance_model.dart'; import 'package:marco/model/project_model.dart'; // Assuming you have a ProjectModel for the projects. import 'package:marco/model/employee_model.dart'; // Assuming you have an EmployeeModel for the employees. import 'package:marco/model/AttendanceLogModel.dart'; class AttendanceController extends GetxController { List attendances = []; List projects = []; // List of projects String? selectedProjectId; // Currently selected project ID List employees = []; // Employees of the selected project @override void onInit() { super.onInit(); fetchProjects(); // Fetch projects when initializing } // Fetch projects from API Future fetchProjects() async { var response = await ApiService.getProjects(); // Call the project API if (response != null) { projects = response .map((json) => ProjectModel.fromJson(json)) .toList(); // Set default to the first project if available if (projects.isNotEmpty) { selectedProjectId = projects.first.id.toString(); await fetchEmployeesByProject( selectedProjectId); // Fetch employees for the first project } update([ 'attendance_dashboard_controller' ]); // Notify GetBuilder with your tag } else { print("No projects data found or failed to fetch data."); } } // Fetch employees by project ID Future fetchEmployeesByProject(String? projectId) async { if (projectId == null) return; var response = await ApiService.getEmployeesByProject(int.parse(projectId)); if (response != null) { employees = response .map((json) => EmployeeModel.fromJson(json)) .toList(); update(); // Trigger UI rebuild } else { print("Failed to fetch employees for project $projectId."); } } Future captureAndUploadAttendance(int employeeId, int projectId, {String comment = "Marked via mobile app"}) async { try { final XFile? image = await ImagePicker().pickImage( source: ImageSource.camera, imageQuality: 80, ); if (image == null) return false; final position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); String imageName = ApiService.generateImageName( employeeId, employees.length + 1, ); return await ApiService.uploadAttendanceImage( employeeId, image, position.latitude, position.longitude, imageName: imageName, projectId: projectId, comment: comment, ); } catch (e) { print("Error capturing or uploading: $e"); return false; } } List attendanceLogs = []; Future fetchAttendanceLogs(String? projectId) async { if (projectId == null) return; var response = await ApiService.getAttendanceLogs(int.parse(projectId)); if (response != null) { attendanceLogs = response .map((json) => AttendanceLogModel.fromJson(json)) .toList(); update(); } else { print("Failed to fetch logs for project $projectId."); } } }