import 'package:get/get.dart'; import 'package:logger/logger.dart'; import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/controller/project_controller.dart'; final Logger log = Logger(); class DashboardController extends GetxController { // Observables final RxList> roleWiseData = >[].obs; final RxBool isLoading = false.obs; final RxString selectedRange = '7D'.obs; final RxBool isChartView = true.obs; // Inject the ProjectController final ProjectController projectController = Get.find(); @override void onInit() { super.onInit(); final selectedProjectIdRx = projectController.selectedProjectId; if (selectedProjectIdRx != null) { // Fix: explicitly cast and use ever with non-nullable type ever(selectedProjectIdRx, (id) { if (id.isNotEmpty) { fetchRoleWiseAttendance(); } }); // Initial load if already has value if (selectedProjectIdRx.value.isNotEmpty) { fetchRoleWiseAttendance(); } } else { log.w('selectedProjectId observable is null in ProjectController.'); } ever(selectedRange, (_) { fetchRoleWiseAttendance(); }); } int get rangeDays => _getDaysFromRange(selectedRange.value); int _getDaysFromRange(String range) { switch (range) { case '15D': return 15; case '30D': return 30; case '7D': default: return 7; } } void updateRange(String range) { selectedRange.value = range; } void toggleChartView(bool isChart) { isChartView.value = isChart; } Future refreshDashboard() async { await fetchRoleWiseAttendance(); } Future fetchRoleWiseAttendance() async { final String? projectId = projectController.selectedProjectId?.value; if (projectId == null || projectId.isEmpty) { log.w('Project ID is null or empty, skipping API call.'); return; } try { isLoading.value = true; final List? response = await ApiService.getDashboardAttendanceOverview(projectId, rangeDays); if (response != null) { roleWiseData.value = response.map((e) => Map.from(e)).toList(); log.i('Attendance overview fetched successfully.'); } else { log.e('Failed to fetch attendance overview: response is null.'); roleWiseData.clear(); } } catch (e, st) { log.e('Error fetching attendance overview', error: e, stackTrace: st); roleWiseData.clear(); } finally { isLoading.value = false; } } }