import 'dart:developer'; import 'package:easy_localization/easy_localization.dart'; 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/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart'; import 'package:mc_common_app/models/advertisment_models/pdf_receipt_model.dart'; import 'package:mc_common_app/models/advertisment_models/reserved_ads_models.dart'; import 'package:mc_common_app/models/advertisment_models/special_service_model.dart'; import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/utils.dart'; abstract class AdsRepo { Future> getAdsDuration({required int? countryId}); Future> getSpecialServices({required int specialServiceType, required int cityId, required int countryId}); Future createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew}); Future> getAllAds({ required bool isMyAds, AdPostStatus? adPostStatus, CreatedByRoleEnum? createdByRoleEnum, int? vehicleBrandId, int? page, }); Future> getExploreAdsBasedOnFilters({ List? cityIdsList, List? vehicleModelYearIdsList, List? vehicleBrandIdsList, List? createdByRolesIdsList, List? vehicleAdConditionIdsList, List? vehicleAdCreatedDateList, int page, bool isMyAds = false, }); Future> getMyReservedAds(); Future> getMyAds(); Future getAdBankingAccountInfo({required int adId}); Future updateAdStatus({required int adId, required AdPostStatus adStatusToUpdate, String? comment}); Future createAppointmentForAdSpecialService({required int adId, required int photoOfficeID, required int photoOfficeSlotID, required int adsSpecialServiceID}); Future deleteAd({required int adId}); Future cancelMyAdReservation({required int adId, required int adsReserveStatus, required String reason}); Future createReserveAd({required int adId}); Future uploadBankReceiptsOnReserveDealDone({required int adId, required String detailNote, required List pdfReceiptsList}); Future> getChatBuyersForAds({required int adsID}); Future createAdExtensionOrder({required int adID, required List specialServiceIds, required int adsDurationId}); } class AdsRepoImp implements AdsRepo { ApiClient apiClient = injector.get(); AppState appState = injector.get(); @override Future> getAdsDuration({required int? countryId}) async { int roleID = appState.getUser.data!.userInfo!.roleId ?? 0; var param = { "CountryID": countryId.toString(), "roleID": roleID.toString(), }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), queryParameters: param, ApiConsts.vehicleAdsDurationGet, ); List vehicleAdsDuration = List.generate(adsGenericModel.data.length, (index) => AdsDurationModel.fromJson(adsGenericModel.data[index])); return vehicleAdsDuration; } @override Future> getSpecialServices({required int specialServiceType, required int cityId, required int countryId}) async { log("getSpecialServices cityId: $cityId"); var params = { "SpecialServiceType": specialServiceType.toString(), "CountryID": countryId.toString(), }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.vehicleAdsSpecialServicesGet, queryParameters: params); List list = List.generate(adsGenericModel.data.length, (index) => SpecialServiceModel.fromJson(adsGenericModel.data[index])); List specialServicesByCity = getOfficesOnlyByCity(list, cityId); return specialServicesByCity; } List getOfficesOnlyByCity(List allServices, int cityId) { List list = []; for (var service in allServices) { if (service.office != null && service.office!.isNotEmpty) { for (var office in service.office!) { if (office.cityID == cityId) { list.add(service); } } } } return list; } @override Future createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew}) async { List vehiclePostingImages = []; log("adsCreationPayloadModel.ads!.adsDurationID,: ${adsCreationPayloadModel.ads!.adsDurationID}"); adsCreationPayloadModel.vehiclePosting!.vehiclePostingImages?.forEach((element) { var imageMap = { "id": element.id ?? 0, "imageName": element.imageName, "imageUrl": element.imageUrl, "imageStr": element.imageStr, "vehiclePostingID": element.vehiclePostingID ?? 0, "vehiclePosting": null, }; vehiclePostingImages.add(imageMap); }); List vehiclePostingDamageParts = []; int sellerTypeID = AppState().getUser.data!.userInfo!.roleId ?? 0; adsCreationPayloadModel.vehiclePosting!.vehiclePostingDamageParts?.forEach((element) { log("comment: ${element.comment}"); var imageMap = { "id": element.id ?? 0, "comment": element.comment, "vehicleImageBase64": element.vehicleImageBase64, "vehicleDamagePartID": element.vehicleDamagePartID, "vehiclePostingID": element.vehiclePostingID ?? 0, "isActive": true }; vehiclePostingDamageParts.add(imageMap); }); var postParams = { "ads": { "id": adsCreationPayloadModel.ads!.id ?? 0, "adsDurationID": adsCreationPayloadModel.ads!.adsDurationID, "startDate": adsCreationPayloadModel.ads!.startDate, "countryId": adsCreationPayloadModel.ads!.countryId, "specialServiceIDs": adsCreationPayloadModel.ads!.specialServiceIDs, "isMCHandled": false, "showContactDetail": adsCreationPayloadModel.ads!.showContactDetail ?? false, "isOnWhatsApp": adsCreationPayloadModel.ads!.isOnWhatsApp ?? false, }, "vehiclePosting": { "id": adsCreationPayloadModel.vehiclePosting!.id ?? 0, "userID": adsCreationPayloadModel.vehiclePosting!.userID, "vehicleType": adsCreationPayloadModel.vehiclePosting!.vehicleType, "vehicleModelID": adsCreationPayloadModel.vehiclePosting!.vehicleModelID, "vehicleModelYearID": adsCreationPayloadModel.vehiclePosting!.vehicleModelYearID, "vehicleColorID": adsCreationPayloadModel.vehiclePosting!.vehicleColorID, "vehicleCategoryID": adsCreationPayloadModel.vehiclePosting!.vehicleCategoryID, "vehicleConditionID": adsCreationPayloadModel.vehiclePosting!.vehicleConditionID, "vehicleMileageID": adsCreationPayloadModel.vehiclePosting!.vehicleMileageID, "vehicleTransmissionID": adsCreationPayloadModel.vehiclePosting!.vehicleTransmissionID, "vehicleSellerTypeID": sellerTypeID, "cityID": adsCreationPayloadModel.vehiclePosting!.cityID, "price": adsCreationPayloadModel.vehiclePosting!.price, "vehicleVIN": adsCreationPayloadModel.vehiclePosting!.vehicleVIN, "vehicleDescription": adsCreationPayloadModel.vehiclePosting!.vehicleDescription, "vehicleTitle": adsCreationPayloadModel.vehiclePosting!.vehicleTitle, "vehicleDescriptionN": adsCreationPayloadModel.vehiclePosting!.vehicleDescription, "isFinanceAvailable": adsCreationPayloadModel.vehiclePosting!.isFinanceAvailable, "warantyYears": adsCreationPayloadModel.vehiclePosting!.warantyYears, "demandAmount": adsCreationPayloadModel.vehiclePosting!.demandAmount, // "adStatus": 1, "vehiclePostingImages": vehiclePostingImages, "vehiclePostingDamageParts": vehiclePostingDamageParts, "mobileNo": adsCreationPayloadModel.vehiclePosting!.phoneNo, "whatsAppNo": adsCreationPayloadModel.vehiclePosting!.whatsAppNo, } }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), isCreateNew ? ApiConsts.vehicleAdsSingleStepCreate : ApiConsts.vehicleAdsSingleStepUpdate, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future> getAllAds({ required isMyAds, AdPostStatus? adPostStatus, CreatedByRoleEnum? createdByRoleEnum, int? vehicleBrandId, int? page, }) async { Map onlyMyAdsParams = { "userID": appState.getUser.data!.userInfo!.userId ?? "", }; if (isMyAds && adPostStatus != null) { onlyMyAdsParams.addAll({ "AdsStatuses": ["${adPostStatus.getIdFromAdPostStatusEnum()}"], "PageSize": "30", "PageIndex": page != null ? page.toString() : "0", }); } var allAdsParams = { "AdsStatuses": ["${AdPostStatus.active.getIdFromAdPostStatusEnum()}"], //only Active ADS "isActive": "true", //only Active ADS "isExplore": "true", "PageSize": "30", "PageIndex": page != null ? page.toString() : "0", }; if (!isMyAds && createdByRoleEnum != null) { allAdsParams.addAll({ "CreatedByRoles": ["${createdByRoleEnum.getIdFromCreatedByRoleEnum()}"], }); } if (!isMyAds && vehicleBrandId != null && vehicleBrandId != 0) { allAdsParams.addAll({ "VehicleBrandIDs": ["$vehicleBrandId"], }); } GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.vehicleAdsGet, queryParameters: isMyAds ? onlyMyAdsParams : allAdsParams, ); List vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], isMyAds, adsGenericModel.totalItemsCount ?? 1)); return vehicleAdsDetails; } @override Future> getExploreAdsBasedOnFilters({ List? cityIdsList, List? vehicleModelYearIdsList, List? vehicleBrandIdsList, List? createdByRolesIdsList, List? vehicleAdConditionIdsList, List? vehicleAdCreatedDateList, int? page, bool isMyAds = false, }) async { var parameters = { "CityIDs": cityIdsList ?? [], "VehicleBrandIDs": vehicleBrandIdsList ?? [], "VehicleModelYearIDs": vehicleModelYearIdsList ?? [], "CreatedByRoles": createdByRolesIdsList ?? [], "AdsStatuses": ["${AdPostStatus.active.getIdFromAdPostStatusEnum()}"], //only Active ADS "VehicleNew": vehicleAdConditionIdsList ?? [], "CreatedOn": (vehicleAdCreatedDateList != null && vehicleAdCreatedDateList.isNotEmpty) ? vehicleAdCreatedDateList.first.toString() : "", "isActive": "true", //only Active ADS "isExplore": (!isMyAds).toString(), "PageSize": "30", "PageIndex": page != null ? page.toString() : "1", }; if (isMyAds) { parameters.addAll({ "userID": appState.getUser.data!.userInfo!.userId ?? "", }); } GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.vehicleAdsGet, queryParameters: parameters, ); if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) { Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr()); return []; } List vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], false, adsGenericModel.totalItemsCount ?? 1)); return vehicleAdsDetails; } @override Future> getMyReservedAds() async { var params = { "userID": appState.getUser.data!.userInfo!.userId ?? "", }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.myAdsReserveGet, queryParameters: params, ); if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) { Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr()); return []; } List reservedAds = List.generate(adsGenericModel.data.length, (index) => MyReservedAdsRespModel.fromJson(adsGenericModel.data[index])); List selectedIdsString = reservedAds.map((component) => component.adsID.toString()).toList(); if (selectedIdsString.isEmpty) { return []; } return await getAdsPerSpecificIds(ids: selectedIdsString, reservedAds: reservedAds); } Future> getAdsPerSpecificIds({required List ids, required List reservedAds}) async { var params = { "AdsIDs": ids, "isActive": "true", "PageSize": "30", }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), queryParameters: params, ApiConsts.vehicleAdsGet, ); if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) { Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr()); return []; } List vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true, adsGenericModel.totalItemsCount ?? 1)); for (int i = 0; i < vehicleAdsDetails.length; i++) { vehicleAdsDetails[i].adReserveStatus = (reservedAds[i].adsReserveStatus ?? 0).toAdRserveStatusEnum(); } vehicleAdsDetails.removeWhere((element) => element.adReserveStatus != AdReserveStatus.reserved); return vehicleAdsDetails; } @override Future> getMyAds() async { var params = { "userID": appState.getUser.data!.userInfo!.userId ?? "", "PageSize": "30", }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), queryParameters: params, ApiConsts.vehicleAdsGet, ); if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) { Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr()); return []; } List vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true, adsGenericModel.totalItemsCount ?? 1)); return vehicleAdsDetails; } @override Future getAdBankingAccountInfo({required int adId}) async { var params = { "userID": appState.getUser.data!.userInfo!.userId ?? "", "AdsID": "$adId", }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), queryParameters: params, ApiConsts.adsMCBankAccountAdGet, ); List adsBankDetails = List.generate(adsGenericModel.data.length, (index) => AdsBankDetailsModel.fromJson(adsGenericModel.data[index])); if (adsBankDetails.isNotEmpty) { return adsBankDetails.first; } return null; } @override Future updateAdStatus({required int adId, required AdPostStatus adStatusToUpdate, String? comment}) async { var postParams = { "id": adId, "status": adStatusToUpdate.getIdFromAdPostStatusEnum().toString(), "comment": comment ?? "", }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.adsUpdateStatus, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future createAdExtensionOrder({required int adID, required List specialServiceIds, required int adsDurationId}) async { var postParams = { "adsID": adID, "adsDurationID": adsDurationId, "specialServiceIDs": specialServiceIds, }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.adsExtendDurationCreate, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future deleteAd({required int adId}) async { var postParams = { "adID": adId, }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.deleteAd, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future cancelMyAdReservation({required int adId, required int adsReserveStatus, required String reason}) async { int customerID = AppState().getUser.data!.userInfo!.customerId ?? 0; var postParams = { "adsID": adId, "customerID": customerID, "adsReserveStatus": adsReserveStatus, "comment": reason, }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.deleteAd, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future createReserveAd({required int adId}) async { int customerID = AppState().getUser.data!.userInfo!.customerId ?? 0; var postParams = { "adsID": adId, "customerID": customerID, "adsReserveStatus": 0, }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.adsReserveCreate, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future createAppointmentForAdSpecialService({ required int adId, required int photoOfficeID, required int photoOfficeSlotID, required int adsSpecialServiceID, }) async { String? userId = AppState().getUser.data!.userInfo!.userId ?? ""; var postParams = { "adsID": adId, "photoOfficeID": photoOfficeID, "photoOfficeSlotID": photoOfficeSlotID, "adsSpecialServiceID": adsSpecialServiceID, "UserID": userId, }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.adsPhotoOfficeAppointmentCreate, postParams, token: token, ); return Future.value(adsGenericModel); } @override Future uploadBankReceiptsOnReserveDealDone({required int adId, required String detailNote, required List pdfReceiptsList}) async { int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0; List receiptImages = []; for (var element in pdfReceiptsList) { var pdfReceiptMap = { "id": 0, "imageName": element.pdfName, "imageStr": element.pdfString, }; receiptImages.add(pdfReceiptMap); } var postParams = { "adsID": adId, "customerID": customerId, "detailNote": detailNote, "receiptImages": receiptImages, }; String token = appState.getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), "", postParams, token: token, ); return Future.value(adsGenericModel); } @override Future> getChatBuyersForAds({required int adsID}) async { var queryParameters = {"AdsID": adsID.toString()}; GenericRespModel genericRespModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getChatBuyersForAds, queryParameters: queryParameters, token: appState.getUser.data!.accessToken, ); List buyersChatListForAds = []; if (genericRespModel.data != null && genericRespModel.data.length > 0) { buyersChatListForAds = List.generate(genericRespModel.data.length, (index) => BuyersChatForAdsModel.fromJson(genericRespModel.data[index])); } return buyersChatListForAds; } }