import 'dart:async'; import 'package:flutter/cupertino.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/models/appointments_models/appointment_basic_detail_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_review_model.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/branch.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/document.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/services.dart'; import 'package:mc_common_app/models/provider_branches_models/provider_model.dart'; import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/service_model.dart'; import 'package:mc_common_app/utils/enums.dart'; abstract class BranchRepo { Future createBranch({ required String branchName, required String branchDescription, required int cityId, required String address, required String openTime, required String closeTime, required double latitude, required double longitude, required List imagesList, }); Future updateBranch({ required int branchId, required String branchName, required String branchDescription, required String openTime, required String closeTime, required int cityId, required String address, required String latitude, required String longitude, required List imagesList, bool isNeedToDelete = true, }); Future deleteBranch({required int branchId}); Future fetchAllBranches(); Future fetchBranchCategory(); Future fetchServicesByCategoryId({required int serviceCategoryId}); Future fetchProviderServices(String branchID, String serviceCategoryId); Future> fetchProviderServicesModelByCategoryIdAndBranchID(String branchID, String serviceCategoryId); Future createNewService(List> map); Future getServiceProviderDocument(dynamic userId); Future serviceProviderDocumentsUpdate(List? documents); Future getBranchAndServices(); Future> getAllProvidersWitheBasicData(); Future createService(List> map); Future updateService(List> map); Future updateServiceStatus({required int branchId, required List serviceIds, required ServiceStatusEnum serviceStatusEnum}); Future> getAppointmentsByCategoryOrService({required int branchId, required int serviceId}); Future getMatchedServices(int oldBranchId, int newBranchId, int categoryId); Future duplicateItems({required String providerBranchID, required List items}); Future getAllProviderDealers(Map map); Future getBranchUsers(Map map); Future assignDealerToBranch(Map map); Future removeDealerFromBranch(Map map); Future addNewServicesInAppointment(Map map); Future> getAllNearBranchAndServices({required double latitude, required double longitude}); Future> getServiceItems({required int serviceId}); Future getBranchAndServicesByProviderId(int providerId, {double? latitude, double? longitude}); Future> getBranchesByFilters({ List? providerIdsList, List? categoryIdsList, List? serviceIdsList, int? distanceKm, int? rating, double? latitude, double? longitude, }); Future> getMyRecentBranchesWithServices(); Future> getBranchRatings({required int serviceProviderBranchID}); Future submitBranchRatings({required int serviceProviderBranchID, required String title, required String review, required double ratingNo}); Future addProviderToFavourite({required int providerID}); Future removeProviderFromFavourite({required int providerID}); Future> getMyFavoriteProviders(); } class BranchRepoImp implements BranchRepo { ApiClient apiClient = injector.get(); AppState appState = injector.get(); @override Future createBranch({ required String branchName, required String branchDescription, required int cityId, required String address, required String openTime, required String closeTime, required double latitude, required double longitude, required List imagesList, }) async { List serviceProviderBranchImages = []; for (var element in imagesList) { var imageMap = { "id": element.id ?? 0, "imageName": element.imageName, "imageUrl": element.imageUrl, "imageStr": element.imageStr, }; serviceProviderBranchImages.add(imageMap); } var postParams = { "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "branchName": branchName, "branchDescription": branchDescription, "cityID": cityId.toString(), "address": address, "openTime": openTime, "closeTime": closeTime, "latitude": latitude, "longitude": longitude, "isActive": true, "serviceProviderBranchImages": serviceProviderBranchImages, }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t); } @override Future fetchAllBranches() async { var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => Branch.fromJson(json), ApiConsts.serviceProviderBranchGet, queryParameters: postParams, token: t); } @override Future fetchBranchCategory() async { var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => Category.fromJson(json), ApiConsts.serviceCategoryGet, queryParameters: postParams, token: t); } @override Future fetchServicesByCategoryId({required int serviceCategoryId}) async { var postParams = {"ServiceCategoryID": serviceCategoryId.toString()}; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.servicesGet, queryParameters: serviceCategoryId.toString() != "-1" ? postParams : null, token: t); } @override Future createNewService(List> map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t); } @override Future getServiceProviderDocument(dynamic userId) async { var queryParameters = { "ServiceProviderID": userId.toString(), }; String? token = AppState().getUser.data?.accessToken; debugPrint(token); return await injector .get() .getJsonForObject((json) => Document.fromJson(json), ApiConsts.fetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); } @override Future serviceProviderDocumentsUpdate(List? documents) async { List> map = []; for (int i = 0; i < documents!.length; i++) { if (documents[i].document != null) { var postParams = { "id": documents[i].id, "serviceProviderID": documents[i].serviceProviderId, "documentID": documents[i].documentId, "documentExt": documents[i].fileExt, "documentImage": documents[i].document, "isActive": true, }; map.add(postParams); } } String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderDocumentUpdate, map, token: t); } @override Future getBranchAndServices() async { var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => ProviderModel.fromJson(json), ApiConsts.branchesAndServices, queryParameters: postParams, token: t); } @override Future> getAllProvidersWitheBasicData() async { String t = AppState().getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( token: t, (json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderDDLGet, ); List providersList = List.generate(adsGenericModel.data.length, (index) => ProviderBasicDataModel.fromJson(adsGenericModel.data[index])); return providersList; } @override Future updateBranch({ required int branchId, required String branchName, required String branchDescription, required String openTime, required String closeTime, required int cityId, required String address, required String latitude, required String longitude, required List imagesList, bool isNeedToDelete = true, }) async { List serviceProviderBranchImages = []; for (var element in imagesList) { var imageMap = { "id": element.id ?? 0, "imageName": element.imageName, "imageUrl": element.imageUrl, "imageStr": element.imageStr, }; serviceProviderBranchImages.add(imageMap); } String lat = "0", long = "0"; try { lat = latitude.toString().substring(0, 9); long = longitude.toString().substring(0, 9); } catch (e) {} var postParams = { "id": branchId, "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "branchName": branchName, "branchDescription": branchDescription, "openTime": openTime, "closeTime": closeTime, "cityID": cityId, "address": address, "latitude": lat, "longitude": long, "serviceProviderBranchImages": serviceProviderBranchImages, "isActive": isNeedToDelete }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t); } @override Future deleteBranch({required int branchId}) async { var postParams = { "id": branchId, }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.deleteProviderBranch, postParams, token: t); } @override Future createService(List> map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t); } @override Future updateService(List> map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t); } @override Future updateServiceStatus({required int branchId, required List serviceIds, required ServiceStatusEnum serviceStatusEnum}) async { List ids = []; for (var id in serviceIds) { ids.add(id.toString()); } int providerID = AppState().getUser.data!.userInfo!.providerId; var map = { "ServiceProviderID": providerID.toString(), "ProviderBranchID": branchId.toString(), "ProviderServiceIDs": ids, "Status": serviceStatusEnum.getIdFromServiceStatusEnum().toString(), }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceStatusUpdate, queryParameters: map, token: t); } @override Future> getAppointmentsByCategoryOrService({required int branchId, required int serviceId}) async { var map = { "ProviderBranchID": branchId.toString(), "ServiceProviderServiceID": serviceId.toString(), }; String t = AppState().getUser.data!.accessToken ?? ""; GenericRespModel genericRespModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderAppointmentGetByCategoryOrService, queryParameters: map, token: t, ); List basicAppointmentList = List.generate(genericRespModel.data.length, (index) => AppointmentBasicDetailsModel.fromJson(genericRespModel.data[index])); return basicAppointmentList; } @override Future getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async { var postParams = { "ProviderBranchIDExisted": oldBranchId.toString(), "ProviderBranchIDNew": newBranchId.toString(), "CategoryID": categoryId.toString(), }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t); } @override Future duplicateItems({required String providerBranchID, required List items}) async { String t = AppState().getUser.data!.accessToken ?? ""; Map map = { "providerBranchID": providerBranchID, "serviceItems": items, }; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.duplicateItems, map, token: t); } @override Future getAllProviderDealers(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getAllProviderDealers, queryParameters: map, token: t); } @override Future getBranchUsers(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getBranchUser, queryParameters: map, token: t); } @override Future assignDealerToBranch(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t); } @override Future removeDealerFromBranch(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.removeDealerFromBranch, map, token: t); } @override Future fetchProviderServices(String branchID, String serviceCategoryId) async { var postParams = { "ServiceCategoryID": serviceCategoryId, "ProviderBranchID": branchID, }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.getProviderServices, queryParameters: postParams, token: t); } @override Future> fetchProviderServicesModelByCategoryIdAndBranchID(String branchID, String serviceCategoryId) async { var queryParameters = { "ID": branchID, "ServiceCategoryIDs": [serviceCategoryId], }; String t = AppState().getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getAllNearBranches, token: appState.getUser.data!.accessToken, queryParameters: queryParameters, ); List nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); if (nearBranches.isNotEmpty) { List services = nearBranches.first.branchServices ?? []; return services; } return []; } @override Future addNewServicesInAppointment(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.addNewServicesInAppointment, map, token: t); } @override Future> getAllNearBranchAndServices({required double latitude, required double longitude}) async { var queryParameters = { "isActive": "true", "Status": "3", "latitude": latitude.toString(), "longitude": longitude.toString(), }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getAllNearBranches, token: appState.getUser.data!.accessToken, queryParameters: queryParameters, ); List nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); return nearBranches; } @override Future> getMyRecentBranchesWithServices() async { GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getMyRecentBranches, token: appState.getUser.data!.accessToken, ); List recentBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); return recentBranches; } @override Future> getServiceItems({required int serviceId}) async { var queryParameters = { "ServiceProviderServiceID": serviceId.toString(), }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getServiceItems, token: appState.getUser.data!.accessToken, queryParameters: serviceId.toString() != "-1" ? queryParameters : null, ); List serviceItems = List.generate(adsGenericModel.data.length, (index) => ItemData.fromJson(adsGenericModel.data[index])); return serviceItems; } @override Future getBranchAndServicesByProviderId(int providerId, {double? latitude, double? longitude}) async { var postParams = { "serviceProviderID": providerId.toString(), }; if (latitude != null && longitude != null) { postParams.addAll({"Longitude": "$longitude"}); postParams.addAll({"Latitude": "$latitude"}); } GenericRespModel adsGenericModel = await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.branchesAndServices, token: appState.getUser.data!.accessToken, queryParameters: postParams); return ProviderProfileModel.fromJson(adsGenericModel.data); } @override Future> getBranchesByFilters({ List? providerIdsList, List? categoryIdsList, List? serviceIdsList, int? distanceKm, int? rating, double? latitude, double? longitude, }) async { List providerIds = []; if (providerIdsList != null) { for (var element in providerIdsList) { providerIds.add(element.toString()); } } List categoryIds = []; if (categoryIdsList != null) { for (var element in categoryIdsList) { categoryIds.add(element.toString()); } } List serviceIds = []; if (serviceIdsList != null) { for (var element in serviceIdsList) { serviceIds.add(element.toString()); } } var postParams = { "ServiceProviderIDs": providerIds, "ServiceCategoryIDs": categoryIds, "ServiceIDs": serviceIds, "DistanceByKM": "${distanceKm ?? 0}", "Rating": "${rating ?? 0}", "Latitude": latitude.toString(), "Longitude": longitude.toString(), "Status": "3", }; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getAllNearBranches, token: appState.getUser.data!.accessToken, queryParameters: postParams, ); List nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); return nearBranches; } @override Future> getBranchRatings({required int serviceProviderBranchID}) async { var postParams = {"ServiceProviderBranchID": serviceProviderBranchID.toString()}; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getBranchRatings, token: appState.getUser.data!.accessToken, queryParameters: postParams, ); List branchRatings = List.generate(adsGenericModel.data.length, (index) => BranchRatingModel.fromJson(adsGenericModel.data[index])); return branchRatings; } @override Future submitBranchRatings({required int serviceProviderBranchID, required String title, required String review, required double ratingNo}) async { final customerID = appState.getUser.data!.userInfo!.customerId; final parameters = {"title": title, "review": review, "ratNo": ratingNo, "serviceProviderBranchID": serviceProviderBranchID, "customerID": "$customerID"}; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.createBranchRatings, parameters, token: appState.getUser.data!.accessToken, ); return adsGenericModel; } @override Future addProviderToFavourite({required int providerID}) async { final customerID = appState.getUser.data!.userInfo!.customerId; final parameters = { "providerID": providerID.toString(), "customerID": customerID.toString(), }; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.favouriteServiceProviderCreate, parameters, token: appState.getUser.data!.accessToken, ); return adsGenericModel; } @override Future removeProviderFromFavourite({required int providerID}) async { final parameters = {"id": providerID.toString()}; GenericRespModel adsGenericModel = await apiClient.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.unFavouriteServiceProvider, parameters, token: appState.getUser.data!.accessToken, ); return adsGenericModel; } @override Future> getMyFavoriteProviders() async { final customerID = appState.getUser.data!.userInfo!.customerId; var postParams = {"customerID": customerID.toString()}; GenericRespModel adsGenericModel = await apiClient.getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.favouriteServiceProviderGet, token: appState.getUser.data!.accessToken, queryParameters: postParams, ); List favProviders = List.generate(adsGenericModel.data.length, (index) => ProviderProfileModel.fromJson(adsGenericModel.data[index])); return favProviders; } }