import 'dart:collection'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/exercise_plan.dart'; import 'package:aitrainer_app/model/exercise_plan_detail.dart'; import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/model/model_change.dart'; import 'package:aitrainer_app/service/exercise_plan_service.dart'; class ExercisePlanRepository { bool newPlan = true; ExercisePlan? exercisePlan; LinkedHashMap exercisePlanDetails = LinkedHashMap(); int customerId = 0; ExercisePlanDetail? actualPlanDetail; void setCustomerId(int customerId) { this.customerId = customerId; } int getCustomerId() => customerId; void setExercisePlan(ExercisePlan plan) { this.exercisePlan = plan; } ExercisePlan? getExercisePlan() => exercisePlan; void addDetailToPlan() { if (exercisePlan == null) { this.createNewPlan(); } if (exercisePlan != null && actualPlanDetail != null) { if (exercisePlan!.exercisePlanId != null) { actualPlanDetail!.exercisePlanId = exercisePlan!.exercisePlanId!; } exercisePlanDetails[actualPlanDetail!.exerciseTypeId] = actualPlanDetail!; Cache().addToMyExercisePlanDetails(actualPlanDetail!); } } ExercisePlanDetail? getExercisePlanDetailByExerciseId(int exerciseTypeId) => exercisePlanDetails[exerciseTypeId]; void setActualPlanDetailByExerciseType(ExerciseType exerciseType) { ExercisePlanDetail? detail = exercisePlanDetails[exerciseType.exerciseTypeId]; if (detail != null) { actualPlanDetail = detail; } else { actualPlanDetail = ExercisePlanDetail(exerciseType.exerciseTypeId); } actualPlanDetail!.exerciseType = exerciseType; } ExercisePlanDetail? getActualPlanDetail() => actualPlanDetail; void setActualPlanDetail(ExercisePlanDetail detail) { this.actualPlanDetail = detail; } int getPlanDetailId(int exerciseTypeId) => exercisePlanDetails[exerciseTypeId]!.exercisePlanDetailId!; String getPlanDetail(int exerciseTypeId) { ExercisePlanDetail? detail = exercisePlanDetails[exerciseTypeId]; String detailString = ""; if (detail != null) { detailString = detail.serie.toString() + "x" + detail.repeats.toString() + " " + detail.weightEquation! + "kg"; } return detailString; } int getExercisePlanDetailSize() { return exercisePlanDetails.length; } void updateExercisePlanDetail(ExerciseType exerciseType, int serie, int repeat, String weight) { if (exercisePlanDetails[exerciseType.exerciseTypeId] == null) { return; } ExercisePlanDetail? exercisePlanDetail = exercisePlanDetails[exerciseType.exerciseTypeId]; exercisePlanDetail!.serie = serie; exercisePlanDetail.repeats = repeat; exercisePlanDetail.weightEquation = weight; exercisePlanDetail.change = ModelChange.update; exercisePlanDetails[exerciseType.exerciseTypeId] = exercisePlanDetail; } void removeExerciseTypeFromPlan(ExerciseType exerciseType) { removeExerciseTypeFromPlanByExerciseTypeId(exerciseType.exerciseTypeId); } void removeExerciseTypeFromPlanByExerciseTypeId(int exerciseTypeId) { if (exercisePlanDetails[exerciseTypeId] == null) return; exercisePlanDetails[exerciseTypeId]!.change = ModelChange.delete; Cache().deleteMyExercisePlanDetailByExerciseTypeId(exerciseTypeId); } Future saveExercisePlan() async { if (exercisePlan == null) { this.createNewPlan(); } if (newPlan) { exercisePlan!.dateAdd = DateTime.now(); exercisePlan!.private = true; ExercisePlan savedExercisePlan = await ExercisePlanApi().saveExercisePlan(exercisePlan!); LinkedHashMap savedExercisePlanDetails = LinkedHashMap(); exercisePlanDetails.forEach((exerciseTypeId, exercisePlanDetail) async { exercisePlanDetail.exercisePlanId = savedExercisePlan.exercisePlanId!; ExercisePlanDetail savedDetail = await ExercisePlanApi().saveExercisePlanDetail(exercisePlanDetail); savedExercisePlanDetails[savedDetail.exerciseTypeId] = savedDetail; }); exercisePlan = savedExercisePlan; exercisePlanDetails = savedExercisePlanDetails; } else { //await ExercisePlanApi().updateExercisePlan(exercisePlan, exercisePlan.exercisePlanId); exercisePlanDetails.forEach((exerciseTypeId, exercisePlanDetail) async { if (exercisePlanDetail.change == ModelChange.delete) { await ExercisePlanApi().deleteExercisePlanDetail(exercisePlanDetail.exercisePlanDetailId!); exercisePlanDetail.change = ModelChange.deleted; Cache().deletedMyExercisePlanDetail(exercisePlanDetail); } else if (exercisePlanDetail.change == ModelChange.update) { await ExercisePlanApi().updateExercisePlanDetail(exercisePlanDetail, exercisePlanDetail.exercisePlanDetailId!); Cache().updateMyExercisePlanDetail(exercisePlanDetail); exercisePlanDetail.change = ModelChange.saved; } else if (exercisePlanDetail.change == ModelChange.add) { await ExercisePlanApi().saveExercisePlanDetail(exercisePlanDetail); Cache().addToMyExercisePlanDetails(exercisePlanDetail); exercisePlanDetail.change = ModelChange.saved; } }); } } void createNewPlan() { if (Cache().userLoggedIn == null) { throw Exception("please log in"); } String exercisePlanName; if (this.customerId == Cache().userLoggedIn!.customerId) { exercisePlanName = Cache().userLoggedIn!.name! + " private"; } else { exercisePlanName = Cache().getTrainee()!.name! + " " + Cache().getTrainee()!.firstname! + " private"; } exercisePlan = ExercisePlan(exercisePlanName, this.customerId); newPlan = true; } Future getLastExercisePlan() async { if (customerId == 0) { return null; } ExercisePlan? myExercisePlan = Cache().getMyExercisePlan(); if (myExercisePlan != null) { exercisePlan = myExercisePlan; return myExercisePlan; } exercisePlan = await ExercisePlanApi().getLastExercisePlan(customerId); newPlan = (exercisePlan == null); if (exercisePlan == null) { this.createNewPlan(); } Cache().setMyExercisePlan(exercisePlan!); return exercisePlan; } Future getExercisePlanDetails() async { if (exercisePlan == null) { ExercisePlan? exercisePlan = await this.getLastExercisePlan(); if (exercisePlan == null) { exercisePlanDetails = LinkedHashMap(); return; } } List list = []; LinkedHashMap listCache = Cache().getMyExercisePlanDetails(); if (listCache.length > 0) { exercisePlanDetails = listCache; return; } else { if (exercisePlan!.exercisePlanId != null) { list = await ExercisePlanApi().getExercisePlanDetail(exercisePlan!.exercisePlanId!); } } exercisePlanDetails = LinkedHashMap(); if (list.isNotEmpty) { list.forEach((element) { newPlan = false; ExercisePlanDetail detail = element; exercisePlanDetails[detail.exerciseTypeId] = detail; }); } Cache().setMyExercisePlanDetails(exercisePlanDetails); return; } }