import 'dart:async'; 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/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:flutter/cupertino.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_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'; abstract class BranchRepo { Future createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude); Future updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}); Future fetchAllBranches(); Future fetchBranchCategory(); Future fetchServicesByCategoryId({required int serviceCategoryId}); Future fetchProviderServices(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 getMatchedServices(int oldBranchId, int newBranchId, int categoryId); Future duplicateItems(Map map); Future getAllProviderDealers(Map map); Future getBranchUsers(Map map); Future assignDealerToBranch(Map map); Future removeDealerFromBranch(Map map); Future addNewServicesInAppointment(Map map); Future> getAllNearBranchAndServices(); Future> getServiceItems(int serviceId); Future getBranchAndServicesByProviderId(int providerId); Future> getBranchesByFilters({ List? providerIdsList, List? categoryIdsList, List? serviceIdsList, int? distanceKm, int? rating, double? latitude, double? longitude, }); } class BranchRepoImp implements BranchRepo { ApiClient apiClient = injector.get(); AppState appState = injector.get(); @override Future createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async { var postParams = { "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "branchName": branchName, "branchDescription": branchDescription, "cityID": cityId, "address": address, "latitude": latitude, "longitude": longitude, "isActive": true }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.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.ServiceCategory_Get, 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.Services_Get, 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) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, 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.GetProviderDocument, 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) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, 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(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async { String lat = "0", long = "0"; try { lat = latitude.substring(0, 9); long = longitude.substring(0, 9); } catch (e) {} var postParams = { "id": id, "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "branchName": branchName, "branchDescription": branchDescription, "cityID": cityId, "address": address, "latitude": lat, "longitude": long, "isActive": isNeedToDelete }; String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t); } @override Future createService(List> map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t); } @override Future updateService(List> map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Update, map, token: t); } @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) => MResponse.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t); } @override Future duplicateItems(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.duplicateItems, map, token: t); } @override Future getAllProviderDealers(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.getJsonForObject((json) => MResponse.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) => MResponse.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) => MResponse.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t); } @override Future removeDealerFromBranch(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.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 ?? ""; debugPrint("token " + t); return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.GetProviderServices, queryParameters: postParams, token: t); } @override Future addNewServicesInAppointment(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.AddNewServicesInAppointment, map, token: t); } @override Future> getAllNearBranchAndServices() async { GenericRespModel adsGenericModel = await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.GetAllNearBranches, token: appState.getUser.data!.accessToken); List nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); return nearBranches; } @override Future> getServiceItems(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: queryParameters, ); List serviceItems = List.generate(adsGenericModel.data.length, (index) => ItemData.fromJson(adsGenericModel.data[index])); return serviceItems; } @override Future getBranchAndServicesByProviderId(int providerId) async { var postParams = {"serviceProviderID": providerId.toString()}; 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(), }; 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; } }