import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/location_util.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/prescription_delivery_response_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/prescription_detail_response_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_repo.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_delivery_order_summary_page.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/map/map_utility_screen.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; class PrescriptionsViewModel extends ChangeNotifier { bool isPrescriptionsOrdersLoading = false; bool isPrescriptionsDetailsLoading = false; PrescriptionsRepo prescriptionsRepo; ErrorHandlerService errorHandlerService; NavigationService navServices; // Prescription Orders Lists List patientPrescriptionOrders = []; List patientPrescriptionOrdersByClinic = []; List patientPrescriptionOrdersByHospital = []; List patientPrescriptionOrdersViewList = []; // Prescription Details List List prescriptionDetailsList = []; bool isSortByClinic = true; String prescriptionInstructionsPDFLink = ""; String prescriptionPDFBase64Data = ""; late GeocodeResponse locationGeocodeResponse; bool isPrescriptionsDeliveryOrdersLoading = false; List prescriptionsOrderList = []; PrescriptionsViewModel({required this.prescriptionsRepo, required this.errorHandlerService, required this.navServices}); initPrescriptionsViewModel() { patientPrescriptionOrders.clear(); patientPrescriptionOrdersByClinic.clear(); patientPrescriptionOrdersByHospital.clear(); patientPrescriptionOrdersViewList.clear(); prescriptionsOrderList.clear(); isPrescriptionsOrdersLoading = true; isSortByClinic = true; isPrescriptionsDeliveryOrdersLoading = true; getPatientPrescriptionOrders(); notifyListeners(); } checkIfReminderExistForPrescription(int index) async { prescriptionDetailsList[index].hasReminder = await CalenderUtilsNew.instance.checkIfEventExist(prescriptionDetailsList[index].itemID?.toString() ?? ""); } setPrescriptionsDetailsLoading() { isPrescriptionsDetailsLoading = true; prescriptionDetailsList.clear(); notifyListeners(); } setPrescriptionItemReminder(bool value, PrescriptionDetailResponseModel item) { int index = prescriptionDetailsList.indexOf(item); if (index != -1) { prescriptionDetailsList[index].hasReminder = value; notifyListeners(); } } notify() { notifyListeners(); } setIsSortByClinic(bool value) { isSortByClinic = value; if (isSortByClinic) { patientPrescriptionOrdersViewList = patientPrescriptionOrdersByClinic; } else { patientPrescriptionOrdersViewList = patientPrescriptionOrdersByHospital; } notifyListeners(); } Future getPatientPrescriptionOrders({Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await prescriptionsRepo.getPatientPrescriptionOrders(patientId: "1231755"); result.fold( // (failure) async => await errorHandlerService.handleError(failure: failure), (failure) async { isPrescriptionsOrdersLoading = false; notifyListeners(); }, (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { patientPrescriptionOrders = apiResponse.data!; isPrescriptionsOrdersLoading = false; for (var element in patientPrescriptionOrders) { List prescriptionsByClinic = patientPrescriptionOrdersByClinic.where((elementClinic) => elementClinic.filterName == element.clinicDescription).toList(); if (prescriptionsByClinic.isNotEmpty) { patientPrescriptionOrdersByClinic[patientPrescriptionOrdersByClinic.indexOf(prescriptionsByClinic[0])].prescriptionsList!.add(element); } else { patientPrescriptionOrdersByClinic.add(PrescriptionsList(filterName: element.clinicDescription, prescriptions: element)); } List prescriptionsByHospital = patientPrescriptionOrdersByHospital.where((elementClinic) => elementClinic.filterName == element.name).toList(); if (prescriptionsByHospital.isNotEmpty) { patientPrescriptionOrdersByHospital[patientPrescriptionOrdersByHospital.indexOf(prescriptionsByHospital[0])].prescriptionsList!.add(element); } else { patientPrescriptionOrdersByHospital.add(PrescriptionsList(filterName: element.name, prescriptions: element)); } } patientPrescriptionOrdersViewList = patientPrescriptionOrdersByClinic; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); } } }, ); } Future getPrescriptionDetails(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await prescriptionsRepo.getPatientPrescriptionDetails(prescriptionsResponseModel: prescriptionsResponseModel); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { prescriptionDetailsList = apiResponse.data!; prescriptionDetailsList.forEach((element) async { await checkIfReminderExistForPrescription(prescriptionDetailsList.indexOf(element)); }); isPrescriptionsDetailsLoading = false; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); } } }, ); } Future getPrescriptionInstructionsPDF(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await prescriptionsRepo.getPrescriptionInstructionsPDF(prescriptionsResponseModel: prescriptionsResponseModel); result.fold( (failure) async { onError!(failure.message); }, (apiResponse) { if (apiResponse.messageStatus == 2) { onError!(apiResponse.errorMessage!); // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { prescriptionInstructionsPDFLink = apiResponse.data; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); } } }, ); } Future getPrescriptionPDFBase64(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await prescriptionsRepo.getPrescriptionPDF(prescriptionsResponseModel: prescriptionsResponseModel, prescriptionDetailsList: prescriptionDetailsList); result.fold( (failure) async { onError!(failure.message); }, (apiResponse) { if (apiResponse.messageStatus == 2) { onError!(apiResponse.errorMessage!); } else if (apiResponse.messageStatus == 1) { prescriptionPDFBase64Data = apiResponse.data; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); } } }, ); } showError(String errorMessage) { getIt().showErrorBottomSheet(message: errorMessage); } Future submitPrescriptionDeliveryRequest( {required String latitude, required String longitude, required String appointmentNo, required String dischargeID, required String projectID, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await prescriptionsRepo.submitPrescriptionDeliveryRequest(latitude: latitude, longitude: longitude, appointmentNo: appointmentNo, dischargeID: dischargeID, projectID: projectID); result.fold( (failure) async { onError!(failure.message); }, (apiResponse) { if (apiResponse.messageStatus == 2) { onError!(apiResponse.errorMessage!); } else if (apiResponse.messageStatus == 1) { notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); } } }, ); } void initiatePrescriptionDelivery() async { getIt.get().getLocation( isShowConfirmDialog: true, onSuccess: (position) async { bool result = await navServices.push( CustomPageRoute( page: MapUtilityScreen( confirmButtonString: LocaleKeys.next.tr(), titleString: "Select Location".needTranslation, subTitleString: "Please select the location for prescription delivery".needTranslation, isGmsAvailable: getIt.get().isGMSAvailable, ), direction: AxisDirection.down), ); print("Location Selected: $result"); if (result) { LocationViewModel locationViewModel = getIt.get(); locationGeocodeResponse = locationViewModel.geocodeResponse!; navServices.push( CustomPageRoute( page: PrescriptionDeliveryOrderSummaryPage(), ), ); } }); } Future getPrescriptionOrdersList({Function(dynamic)? onSuccess, Function(String)? onError}) async { isPrescriptionsDeliveryOrdersLoading = true; prescriptionsOrderList.clear(); notifyListeners(); final result = await prescriptionsRepo.getPrescriptionOrdersList(); result.fold( (failure) async { isPrescriptionsDeliveryOrdersLoading = false; notifyListeners(); onError!(failure.message); }, (apiResponse) { if (apiResponse.messageStatus == 2) { isPrescriptionsDeliveryOrdersLoading = false; notifyListeners(); onError!(apiResponse.errorMessage!); } else if (apiResponse.messageStatus == 1) { isPrescriptionsDeliveryOrdersLoading = false; prescriptionsOrderList = apiResponse.data!; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); } } }, ); } }