import 'package:get/get.dart'; import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/model/service_project/service_projects_details_model.dart'; import 'package:marco/model/service_project/job_list_model.dart'; import 'package:marco/model/service_project/service_project_job_detail_model.dart'; class ServiceProjectDetailsController extends GetxController { // Selected project id var projectId = ''.obs; // Project details var projectDetail = Rxn(); // Job list var jobList = [].obs; // Job detail for a selected job var jobDetail = Rxn(); // Loading states var isLoading = false.obs; var isJobLoading = false.obs; var isJobDetailLoading = false.obs; // Error messages var errorMessage = ''.obs; var jobErrorMessage = ''.obs; var jobDetailErrorMessage = ''.obs; // Pagination var pageNumber = 1; final int pageSize = 20; var hasMoreJobs = true.obs; @override void onInit() { super.onInit(); // Fetch job list initially even if projectId is empty fetchProjectJobs(initialLoad: true); } /// Set project id and fetch its details + jobs void setProjectId(String id) { projectId.value = id; fetchProjectDetail(); pageNumber = 1; hasMoreJobs.value = true; fetchProjectJobs(initialLoad: true); } /// Fetch project detail Future fetchProjectDetail() async { if (projectId.value.isEmpty) { errorMessage.value = "Invalid project ID"; return; } isLoading.value = true; errorMessage.value = ''; try { final result = await ApiService.getServiceProjectDetailApi(projectId.value); if (result != null && result.data != null) { projectDetail.value = result.data!; } else { errorMessage.value = result?.message ?? "Failed to fetch project details"; } } catch (e) { errorMessage.value = "Error: $e"; } finally { isLoading.value = false; } } /// Fetch project job list Future fetchProjectJobs({bool initialLoad = false}) async { if (projectId.value.isEmpty && !initialLoad) { jobErrorMessage.value = "Invalid project ID"; return; } if (!hasMoreJobs.value && !initialLoad) return; isJobLoading.value = true; jobErrorMessage.value = ''; try { final result = await ApiService.getServiceProjectJobListApi( projectId: projectId.value, pageNumber: pageNumber, pageSize: pageSize, isActive: true, ); if (result != null && result.data != null) { if (initialLoad) { jobList.value = result.data?.data ?? []; } else { jobList.addAll(result.data?.data ?? []); } hasMoreJobs.value = (result.data?.data?.length ?? 0) == pageSize; if (hasMoreJobs.value) pageNumber++; } else { jobErrorMessage.value = result?.message ?? "Failed to fetch job list"; } } catch (e) { jobErrorMessage.value = "Error fetching jobs: $e"; } finally { isJobLoading.value = false; } } /// Fetch more jobs for pagination Future fetchMoreJobs() async { await fetchProjectJobs(); } /// Manual refresh Future refresh() async { pageNumber = 1; hasMoreJobs.value = true; await Future.wait([ fetchProjectDetail(), fetchProjectJobs(initialLoad: true), ]); } /// Fetch job details by job ID Future fetchJobDetail(String jobId) async { if (jobId.isEmpty) { jobDetailErrorMessage.value = "Invalid job ID"; return; } isJobDetailLoading.value = true; jobDetailErrorMessage.value = ''; try { final result = await ApiService.getServiceProjectJobDetailApi(jobId); if (result != null) { jobDetail.value = result; } else { jobDetailErrorMessage.value = "Failed to fetch job details"; } } catch (e) { jobDetailErrorMessage.value = "Error fetching job details: $e"; } finally { isJobDetailLoading.value = false; } } }