import 'dart:developer'; import 'package:mc_common_app/api/api_client.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependency_injection.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/requests_models/offers_unread_chat_model.dart'; import 'package:mc_common_app/models/requests_models/provider_offers_model.dart'; import 'package:mc_common_app/models/requests_models/providers_offers_chat_model.dart'; import 'package:mc_common_app/models/requests_models/request_model.dart'; import 'package:mc_common_app/utils/enums.dart'; abstract class RequestRepo { Future createRequest({ required int requestTypeId, required int vehicleTypeId, required String brand, required String model, required String year, required bool isNew, required int countryID, required int cityID, required String price, required String description, required String address, required bool isSpecialServiceNeeded, required List requestImages, }); Future> getOffersChatByProvider({int requestId = 0, required int serviceProviderId}); Future getOffersChatsUnreadList({required String userId}); Future getOffersFromProvidersByRequest({required int requestId}); Future> getRequests({required int providerOrCustomerID}); Future> getRequestsBasedOnFilters({ required int requestTypeId, int requestId = 0, int requestStatusId = 0, int reqOfferStatus = 0, int? cityId = 0, int? vehicleYearId = 0, String? vehicleModel = "", String? vehicleBrand = "", String? requestedDate = "", int? conditionId = 0, int pageIndex = 0, int pageSize = 100, }); Future> getServiceRequestsForProviders({required int serviceProviderID}); Future updateRequestStatus({required RequestStatusEnum requestStatusEnum, required int requestId}); Future updateRequestOfferStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId, required String comments}); Future updateRequestDeliveryOptionByCustomer({required int requestID, required int requestOfferId, required RequestDeliveryOptionEnum deliveryOptionEnum}); Future updateRequestOfferFromProvider({ required String message, required int requestId, required int offerId, required String offerPrice, required bool isDeliveryAvailable, required int offerDeliveryOption, required String serviceItemName, required String manufacturedByName, required String manufacturedOn, required List requestImages, required RequestOfferStatusEnum requestOfferStatusEnum, }); Future updateRequestAdditionalAddress({required int requestID, required String additionalAddress}); } class RequestRepoImp implements RequestRepo { ApiClient apiClient = injector.get(); AppState appState = injector.get(); @override Future createRequest({ required int requestTypeId, required int vehicleTypeId, required String brand, required String model, required String year, required bool isNew, required int countryID, required int cityID, required String price, required String description, required String address, required bool isSpecialServiceNeeded, required List requestImages, }) async { Map postParams = { "customerID": appState.getUser.data!.userInfo!.customerId ?? 0, "requestType": requestTypeId, "vehicleTypeID": vehicleTypeId, "brand": brand, "model": model, "year": year, "isNew": isNew, "countryID": countryID, "cityID": cityID, "price": price, "description": description, "address": address, "isSpecialServiceNeeded": false, "requestImages": requestImages, }; GenericRespModel enumGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.createRequest, postParams, token: appState.getUser.data!.accessToken, ); return enumGenericModel; } @override Future> getRequests({required int providerOrCustomerID}) async { final paramsForGetRequests = { "pageSize": 100, "pageIndex": 0, }; if (appState.currentAppType == AppType.provider) { paramsForGetRequests.addEntries([MapEntry("providerID", providerOrCustomerID)]); } else { paramsForGetRequests.addEntries([MapEntry("customerID", providerOrCustomerID)]); } GenericRespModel enumGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getRequest, paramsForGetRequests, token: appState.getUser.data!.accessToken, ); List requests = List.generate( enumGenericModel.data.length, (index) => RequestModel.fromJson( enumGenericModel.data[index], ), ); return requests; } @override Future> getRequestsBasedOnFilters({ required int requestTypeId, int requestStatusId = 0, int requestId = 0, int reqOfferStatus = 0, int? cityId = 0, int? vehicleYearId = 0, String? vehicleModel = "", String? vehicleBrand = "", String? requestedDate = "", int? conditionId = 0, int pageIndex = 0, int pageSize = 100, }) async { final paramsForGetRequests = { "pageIndex": pageIndex, "pageSize": pageSize, "doPagination": true, "requestType": requestTypeId.toString(), "requestStatus": requestStatusId.toString(), "reqOfferStatus": reqOfferStatus.toString(), "brand": vehicleBrand.toString(), "requestedDate": requestedDate, "model": vehicleModel.toString(), "year": vehicleYearId.toString(), "cityID": cityId.toString(), "isNew": conditionId == 0 ? "" : conditionId == 1, }; if (appState.currentAppType == AppType.customer) { paramsForGetRequests.addEntries([MapEntry("customerID", appState.getUser.data!.userInfo!.customerId ?? 0)]); } else { paramsForGetRequests.addEntries([MapEntry("providerID", appState.getUser.data!.userInfo!.providerId.toString())]); } paramsForGetRequests.removeWhere((key, value) => value == "" || value == "0"); if (appState.currentAppType == AppType.provider && requestTypeId == 2) { List requests = await getRequestBasedOnFiltersForProvidersServiceRequest(paramsForGetRequests); return requests; } GenericRespModel enumGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getRequest, paramsForGetRequests, token: appState.getUser.data!.accessToken, ); List requests = List.generate( enumGenericModel.data.length, (index) => RequestModel.fromJson(enumGenericModel.data[index]), ); return requests; } Future> getRequestBasedOnFiltersForProvidersServiceRequest(Map parameters) async { List requestStatusList = [ RequestStatusEnum.submitted.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.completed.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.inProgress.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.paid.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.delivery.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.shipping.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.selfPickup.getIdFromRequestStatusEnum().toString(), ]; if (parameters['requestStatus'] != null && parameters['requestStatus'] != "0") { parameters.addEntries([ MapEntry("RequestStatuses", [parameters['requestStatus'].toString()]) ]); } else { parameters.removeWhere((key, value) => key == "requestStatus"); parameters.addEntries([MapEntry("RequestStatuses", requestStatusList)]); } parameters.removeWhere((key, value) => key == "providerID"); parameters.removeWhere((key, value) => key == "pageIndex"); parameters.removeWhere((key, value) => key == "pageSize"); parameters.removeWhere((key, value) => key == "doPagination"); parameters.addEntries([MapEntry("ServiceProviderId", appState.getUser.data!.userInfo!.providerId.toString())]); // final parameters = { // "ServiceProviderId": serviceProviderID.toString(), // "RequestType": "2", // Only to get the Service Request // "RequestStatuses": requestStatusList, // }; GenericRespModel genericRespModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getServiceRequestsForProvider, queryParameters: parameters, token: appState.getUser.data!.accessToken, ); List requests = List.generate( genericRespModel.data.length, (index) => RequestModel.fromJson( genericRespModel.data[index], ), ); return requests; } @override Future> getServiceRequestsForProviders({required int serviceProviderID}) async { List requestStatusList = [ RequestStatusEnum.submitted.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.completed.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.inProgress.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.paid.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.delivery.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.shipping.getIdFromRequestStatusEnum().toString(), RequestStatusEnum.selfPickup.getIdFromRequestStatusEnum().toString(), ]; final parameters = { "ServiceProviderId": serviceProviderID.toString(), "RequestType": "2", // Only to get the Service Request "RequestStatuses": requestStatusList, }; GenericRespModel genericRespModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getServiceRequestsForProvider, queryParameters: parameters, token: appState.getUser.data!.accessToken, ); List requests = List.generate( genericRespModel.data.length, (index) => RequestModel.fromJson( genericRespModel.data[index], ), ); return requests; } @override Future> getOffersChatByProvider({int requestId = 0, required int serviceProviderId}) async { var queryParameters = { "RequestID": requestId.toString(), "ServiceProviderID": serviceProviderId.toString(), }; GenericRespModel genericRespModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getRequestOffers, queryParameters: queryParameters, token: appState.getUser.data!.accessToken, ); List offersList = List.generate( genericRespModel.data.length, (index) => ProviderOffersChatsModel.fromJson(genericRespModel.data[index]), ); return offersList; } @override Future getOffersChatsUnreadList({required String userId}) async { var queryParameters = { "ReceiverUserID": userId.toString(), }; GenericRespModel genericRespModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.reqChatUnreadGet, queryParameters: queryParameters, token: appState.getUser.data!.accessToken, ); OffersUnreadChatModel offersUnreadChatModel = OffersUnreadChatModel.fromJson(genericRespModel.data); return offersUnreadChatModel; } @override Future getOffersFromProvidersByRequest({required int requestId}) async { final customerId = appState.getUser.data!.userInfo!.customerId; var queryParameters = { "customerID": customerId.toString(), "requestID": requestId.toString(), }; GenericRespModel genericRespModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.requestOffersSpsGet, queryParameters, token: appState.getUser.data!.accessToken, ); ProviderOffersModel providerOffersModel = ProviderOffersModel(); if (genericRespModel.data != null && genericRespModel.data.length > 0) { providerOffersModel = ProviderOffersModel.fromJson(genericRespModel.data.first, requestId); } return providerOffersModel; } @override Future updateRequestStatus({required RequestStatusEnum requestStatusEnum, required int requestId}) async { var queryParameters = { "requestId": requestId.toString(), "requestStatus": requestStatusEnum.getIdFromRequestStatusEnum().toString(), }; GenericRespModel genericRespModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), appState.currentAppType == AppType.provider ? ApiConsts.updateRequestProvider : ApiConsts.updateRequestCustomer, queryParameters, token: appState.getUser.data!.accessToken, ); return genericRespModel; } @override Future updateRequestAdditionalAddress({required int requestID, required String additionalAddress}) async { var queryParameters = { "requestID": requestID.toString(), "additionalAddress": additionalAddress.toString(), }; GenericRespModel genericRespModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.requestUpdateAdditionalAddress, queryParameters, token: appState.getUser.data!.accessToken, ); return genericRespModel; } @override Future updateRequestOfferStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId, required String comments}) async { var queryParameters = { "requestOfferId": requestOfferId.toString(), "offerStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum().toString(), "comments": comments, }; GenericRespModel genericRespModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.updateRequestOfferStatus, queryParameters, token: appState.getUser.data!.accessToken, ); return genericRespModel; } @override Future updateRequestDeliveryOptionByCustomer({required int requestID, required int requestOfferId, required RequestDeliveryOptionEnum deliveryOptionEnum}) async { var queryParameters = { "requestID": requestID.toString(), "requestOfferId": requestOfferId.toString(), "deliveryOption": deliveryOptionEnum.getIdRequestDeliveryOptionEnum().toString(), }; GenericRespModel genericRespModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.requestOfferUpdateDeliveryOptionByCustomer, queryParameters, token: appState.getUser.data!.accessToken, ); return genericRespModel; } @override Future updateRequestOfferFromProvider({ required String message, required int requestId, required int offerId, required String offerPrice, required bool isDeliveryAvailable, required int offerDeliveryOption, required String serviceItemName, required String manufacturedByName, required String manufacturedOn, required List requestImages, required RequestOfferStatusEnum requestOfferStatusEnum, }) async { final providerId = appState.getUser.data!.userInfo!.providerId; var queryParameters = { "id": offerId, "requestID": requestId, "serviceProviderID": providerId, "offerStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum(), "serviceItem": serviceItemName, "comment": message, "price": offerPrice, "offeredItemCreatedByName": manufacturedByName.toString(), "offeredItemCreatedOn": manufacturedOn.toString(), "reqOfferImages": requestImages, "isDeliveryAvailable": isDeliveryAvailable, "offerDeliveryOption": offerDeliveryOption }; GenericRespModel genericRespModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.updateRequestOffer, queryParameters, token: appState.getUser.data!.accessToken, ); return genericRespModel; } }