import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_it/get_it.dart'; import 'package:muaawana/models/emergency/Result.dart'; import 'package:muaawana/models/utils/api_response.dart'; import 'package:muaawana/services/urgent_request_services.dart'; import '../models/order/order_response.dart'; import '../services/technician_services.dart'; import '../utils/connection.dart'; enum OrderStatusCheckbox { checkbox1, checkbox2, checkbox3, checkbox4, checkbox5 } const Map checkBoxButtonMapper = { OrderStatusCheckbox.checkbox1: "Request Item", OrderStatusCheckbox.checkbox2: "Request Item", OrderStatusCheckbox.checkbox3: "Finish Order", OrderStatusCheckbox.checkbox4: "Report", OrderStatusCheckbox.checkbox5: "Report", }; const Map checkBoxState = { OrderStatusCheckbox.checkbox1: "ON_THE_WAY", OrderStatusCheckbox.checkbox2: "STARTING_WORK", OrderStatusCheckbox.checkbox3: "WORK_COMPLETED", OrderStatusCheckbox.checkbox4: "WORK_PAYMENT_DONE", OrderStatusCheckbox.checkbox5: "WORK_AND_PAYMENT_NOT_DONE", }; class OrderStatusProvider with ChangeNotifier { TechnicianService get service => GetIt.I(); UrgentRequestService get urgentRequestService => GetIt.I(); bool loader = false; Order? pickedOrder; UrgentRequest? pickedUrgentRequest; OrderStatusCheckbox? _checkedBox; String _buttonText = 'Request Item'; int activeStep = 0; String get buttonText => _buttonText; OrderStatusCheckbox? get checkedBox => _checkedBox; setActiveStep(int step) { activeStep = 3; notifyListeners(); } void updateCheckbox(OrderStatusCheckbox checkbox) { if (_checkedBox == checkbox) { _checkedBox = null; } else { _checkedBox = checkbox; } _buttonText = checkBoxButtonMapper[checkbox]!; notifyListeners(); } bool isCheckboxChecked(OrderStatusCheckbox checkbox) { return _checkedBox == checkbox; } bool verifyRequestState(OrderStatusCheckbox checkbox, Order order) { final newState = checkBoxState[checkbox]; if (order.driverState == "ON_THE_WAY") { if (newState == order.driverState) { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Already on the way.', duration: Duration(seconds: 2), ), ); return false; } else { return true; } } else if (order.driverState == "STARTING_WORK") { if (newState == "ON_THE_WAY" || newState == "STARTING_WORK") { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Already started working', duration: Duration(seconds: 2), ), ); return false; } else { return true; } } else if (order.driverState == "WORK_PAYMENT_DONE") { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Already Finished', duration: Duration(seconds: 2), ), ); return false; } else if (order.driverState == "WORK_NOT_DONE") { if (newState == "ON_THE_WAY" || newState == "STARTING_WORK" || newState == "WORK_PAYMENT_DONE" || newState == "WORK_AND_PAYMENT_NOT_DONE") { return true; } else { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Work already not done.', duration: Duration(seconds: 2), ), ); return false; } } else if (order.driverState == "WORK_AND_PAYMENT_NOT_DONE") { if (newState == "WORK_PAYMENT_DONE") { return true; } else { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'work already done.', duration: Duration(seconds: 2), ), ); return false; } } else { return true; } } bool verifyUrgentRequestState( OrderStatusCheckbox checkbox, UrgentRequest order) { final newState = checkBoxState[checkbox]; if (order.driverState == "ON_THE_WAY") { if (newState == order.driverState) { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Already on the way.', duration: Duration(seconds: 2), ), ); return false; } else { return true; } } else if (order.driverState == "STARTING_WORK") { if (newState == "ON_THE_WAY" || newState == "STARTING_WORK") { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Already started working', duration: Duration(seconds: 2), ), ); return false; } else { return true; } } else if (order.driverState == "WORK_PAYMENT_DONE") { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Already Finished', duration: Duration(seconds: 2), ), ); return false; } else if (order.driverState == "WORK_NOT_DONE") { if (newState == "ON_THE_WAY" || newState == "STARTING_WORK" || newState == "WORK_PAYMENT_DONE" || newState == "WORK_AND_PAYMENT_NOT_DONE") { return true; } else { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'Work already not done.', duration: Duration(seconds: 2), ), ); return false; } } else if (order.driverState == "WORK_AND_PAYMENT_NOT_DONE") { if (newState == "WORK_PAYMENT_DONE") { return true; } else { Get.showSnackbar( const GetSnackBar( title: "Error", message: 'work already done.', duration: Duration(seconds: 2), ), ); return false; } } else { return true; } } updateStep(bool isUrgent, {Order? order, UrgentRequest? urgentRequest}) { if (isUrgent) { if (urgentRequest!.requeststate == "ACCEPTED" && (urgentRequest.driverState == "WAITING" || urgentRequest.driverState == "ON_THE_WAY")) { activeStep = 0; } else if (urgentRequest.driverState == "STARTING_WORK" || urgentRequest.requeststate == "IN_PROGRESS") { activeStep = 1; } else if (urgentRequest.driverState == "WORK_COMPLETED" && urgentRequest.requeststate != "COMPLETED") { activeStep = 2; } else if (urgentRequest.requeststate == "COMPLETED" && urgentRequest.driverState == "WORK_PAYMENT_DONE") { activeStep = 3; } } else { if (order?.requeststate == "ACCEPTED" && (order?.driverState == "WAITING" || order?.driverState == "ON_THE_WAY")) { activeStep = 0; } else if (order?.driverState == "STARTING_WORK" || order?.requeststate == "IN_PROGRESS") { activeStep = 1; } else if (order?.requeststate == "COMPLETED" && order?.driverState == "WORK_COMPLETED") { activeStep = 3; } else if (order?.driverState == "WORK_COMPLETED" && order?.requeststate != "COMPLETED") { activeStep = 2; } else if (order?.driverState == "WORK_PAYMENT_DONE") { activeStep = 4; } } notifyListeners(); } changeRequestState(int requestId, OrderStatusCheckbox checkbox, bool isUrgent, {Order? order, UrgentRequest? urgentRequest}) async { if (await Connection.checkConnection()) { loader = true; notifyListeners(); try { APIResponse? rejectRequestResult; if (isUrgent) { pickedUrgentRequest = urgentRequest; rejectRequestResult = await urgentRequestService .changeUrgentRequestState(requestId, checkBoxState[checkbox]!); } else { pickedOrder = order; rejectRequestResult = await service.changeRequestState( requestId, checkBoxState[checkbox]!); } if (rejectRequestResult != null) { if (rejectRequestResult.statusCode == 200 || rejectRequestResult.statusCode == 201) { if (isUrgent) { pickedUrgentRequest!.driverState = checkBoxState[checkbox]!; updateStep(isUrgent, urgentRequest: pickedUrgentRequest); } else { pickedOrder!.driverState = checkBoxState[checkbox]!; updateStep(isUrgent, order: pickedOrder); } loader = false; notifyListeners(); } else { loader = false; notifyListeners(); } } else {} } catch (e, stackTrace) { log(stackTrace.toString()); loader = false; notifyListeners(); } } else { /// No Internet Connection loader = false; notifyListeners(); } } receivePayment(int requestId, bool isUrgent, double receivedAmount, String paymentMethod, String? code) async { if (await Connection.checkConnection()) { loader = true; notifyListeners(); try { APIResponse? receivePaymentResult; if (isUrgent) { receivePaymentResult = await service.receivePaymentUrgentRequest( receivedAmount, requestId, paymentMethod, code); } else { receivePaymentResult = await service.receivePaymentRequest( receivedAmount, requestId, paymentMethod, code); } if (receivePaymentResult != null) { if (receivePaymentResult.statusCode == 200 || receivePaymentResult.statusCode == 201) { if (isUrgent) { pickedUrgentRequest!.driverState = checkBoxState[OrderStatusCheckbox.checkbox4]!; changeRequestState(pickedUrgentRequest!.id!, OrderStatusCheckbox.checkbox4, isUrgent, urgentRequest: pickedUrgentRequest); updateStep(isUrgent, urgentRequest: pickedUrgentRequest); } else { pickedOrder!.driverState = checkBoxState[OrderStatusCheckbox.checkbox4]!; changeRequestState( pickedOrder!.id!, OrderStatusCheckbox.checkbox4, isUrgent, order: pickedOrder); updateStep(isUrgent, order: pickedOrder); } loader = false; notifyListeners(); return true; } else { loader = false; notifyListeners(); return false; } } else { // Get.showSnackbar( // const GetSnackBar( // title: "Error", // message: 'An error occurred.', // duration: Duration(seconds: 2), // ), // ); loader = false; notifyListeners(); return false; } } catch (e, stackTrace) { log(stackTrace.toString()); loader = false; notifyListeners(); return false; } } else { /// No Internet Connection loader = false; notifyListeners(); return false; } } }