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/dependencies.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:mc_common_app/models/provider_branches_models/profile/services.dart'; import 'package:mc_common_app/models/appointments_models/schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/utils/enums.dart'; import '../models/appointments_models/appointment_list_model.dart'; abstract class AppointmentRepo { Future> getMyAppointments( Map map); Future updateAppointmentStatus(Map map); Future updateAppointmentPaymentStatus(Map map); Future getAppointmentSlots(Map map); Future createMergeAppointment(Map map); Future getAllServices(String branchId); Future createSchedule(Map map); Future addServicesInSchedule(Map map); Future updateSchedule(Map map); Future> getSchedules(String branchId); Future updateServicesInSchedule(Map map); Future> mergeServiceIntoAvailableSchedules({ required List serviceItemIdsForHome, required List serviceItemIdsForWorkshop, }); Future createServiceAppointment( {required List schedules, required int serviceProviderID}); Future cancelOrRescheduleServiceAppointment( {required int serviceAppointmentID, required int serviceSlotID, required int appointmentScheduleAction}); } class AppointmentRepoImp implements AppointmentRepo { @override Future getAllServices(String branchId) async { Map map = {"ProviderBranchID": branchId}; String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().getJsonForObject( (json) => Services.fromJson(json), ApiConsts.getServicesOfBranch, token: t, queryParameters: map); } @override Future createSchedule(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t); } @override Future addServicesInSchedule(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t); } @override Future> getSchedules(String branchId) async { Map map = {"ServiceProviderBranchID": branchId}; String t = AppState().getUser.data!.accessToken ?? ""; GenericRespModel adsGenericModel = await injector.get().getJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.getSchedule, token: t, queryParameters: map, ); return List.generate(adsGenericModel.data.length, (index) => ScheduleData.fromJson(adsGenericModel.data[index])); } @override Future updateSchedule(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t); } @override Future updateServicesInSchedule(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t); } Future> mergeServiceIntoAvailableSchedules({ required List serviceItemIdsForHome, required List serviceItemIdsForWorkshop, }) async { String t = AppState().getUser.data!.accessToken ?? ""; var queryParameters = [ { "appointmentType": 2, "ServiceItemIDs": serviceItemIdsForHome, }, { "appointmentType": 1, "ServiceItemIDs": serviceItemIdsForWorkshop, } ]; GenericRespModel adsGenericModel = await injector.get().postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.GetServiceItemAppointmentScheduleSlots, queryParameters, token: t, ); if (adsGenericModel.data == null) { return []; } List serviceAppointmentScheduleModel = List.generate( adsGenericModel.data.length, (index) => ServiceAppointmentScheduleModel.fromJson( adsGenericModel.data[index], isForAppointment: true)); return serviceAppointmentScheduleModel; } Future createServiceAppointment( {required List schedules, required int serviceProviderID}) async { String t = AppState().getUser.data!.accessToken ?? ""; int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0; List> mapList = []; schedules.forEach((schedule) { List serviceItemIds = []; schedule.servicesListInAppointment!.forEach((service) { service.serviceItems!.forEach((item) { serviceItemIds.add(item.id!); }); }); mapList.add({ "serviceSlotID": schedule.selectedCustomTimeDateSlotModel!.date!.slotId, "serviceProviderID": serviceProviderID, "customerID": customerId, "serviceItemID": serviceItemIds, }); }); GenericRespModel adsGenericModel = await injector.get().postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.ServiceProvidersAppointmentCreate, mapList, token: t, ); return adsGenericModel; } @override Future cancelOrRescheduleServiceAppointment( {required int serviceAppointmentID, required int serviceSlotID, required int appointmentScheduleAction}) async { String t = AppState().getUser.data!.accessToken ?? ""; final payload = { "serviceAppointmentID": serviceAppointmentID, "serviceSlotID": serviceSlotID, "appointmentScheduleAction": appointmentScheduleAction, }; GenericRespModel adsGenericModel = await injector.get().postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConsts.ServiceProviderAppointmentRescheduleCancelAppointment, payload, token: t, ); return adsGenericModel; } @override Future> getMyAppointments( Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; GenericRespModel genericRespModel = await injector.get().getJsonForObject( token: t, (json) => GenericRespModel.fromJson(json), queryParameters: map, ApiConsts.serviceProvidersAppointmentGet, ); List appointmentList = List.generate( genericRespModel.data.length, (index) => AppointmentListModel.fromJson(genericRespModel.data[index])); return appointmentList; } @override Future getAppointmentSlots(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; MResponse adsGenericModel = await injector.get().getJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.getAppointmentSlots, token: t, queryParameters: map, ); return adsGenericModel; } @override Future updateAppointmentPaymentStatus( Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.updateAppointmentPaymentStatus, map, token: t); } @override Future updateAppointmentStatus(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.updateAppointmentStatus, map, token: t); } @override Future createMergeAppointment(Map map) async { String t = AppState().getUser.data!.accessToken ?? ""; return await injector.get().postJsonForObject( (json) => MResponse.fromJson(json), ApiConsts.createMergeAppointment, map, token: t); } }