|
|
|
@@ -6,6 +6,7 @@ import 'package:aitrainer_app/model/exercise_plan_detail.dart';
|
|
|
|
|
import 'package:aitrainer_app/model/exercise_tree.dart';
|
|
|
|
|
import 'package:aitrainer_app/model/fitness_state.dart';
|
|
|
|
|
import 'package:aitrainer_app/model/training_plan.dart';
|
|
|
|
|
import 'package:aitrainer_app/model/training_plan_detail.dart';
|
|
|
|
|
import 'package:aitrainer_app/repository/training_plan_day_repository.dart';
|
|
|
|
|
import 'package:aitrainer_app/util/app_language.dart';
|
|
|
|
|
import 'package:aitrainer_app/util/common.dart';
|
|
|
|
@@ -69,9 +70,13 @@ class TrainingPlanRepository {
|
|
|
|
|
|
|
|
|
|
// 3 calculate weights
|
|
|
|
|
int index = 0;
|
|
|
|
|
|
|
|
|
|
int exerciseTypeIdOrig = 0;
|
|
|
|
|
trainingPlan.details!.forEach((elem) {
|
|
|
|
|
CustomerTrainingPlanDetails detail = CustomerTrainingPlanDetails();
|
|
|
|
|
List<CustomerTrainingPlanDetails> list = createDetail(plan, elem, exerciseTypeIdOrig, index);
|
|
|
|
|
list.forEach((element) {
|
|
|
|
|
plan.details.add(element);
|
|
|
|
|
});
|
|
|
|
|
/* CustomerTrainingPlanDetails detail = CustomerTrainingPlanDetails();
|
|
|
|
|
detail.customerTrainingPlanDetailsId = ++index;
|
|
|
|
|
detail.trainingPlanDetailsId = elem.trainingPlanDetailId;
|
|
|
|
|
detail.exerciseTypeId = elem.exerciseTypeId;
|
|
|
|
@@ -107,7 +112,25 @@ class TrainingPlanRepository {
|
|
|
|
|
detail.baseOneRepMax = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble());
|
|
|
|
|
}
|
|
|
|
|
detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId);
|
|
|
|
|
plan.details.add(detail);
|
|
|
|
|
|
|
|
|
|
// first repeat: 50% more
|
|
|
|
|
if (detail.weight != null && detail.weight! > 0 && exerciseTypeIdOrig != detail.exerciseTypeId && detail.repeats! > 0) {
|
|
|
|
|
CustomerTrainingPlanDetails firstDetail = CustomerTrainingPlanDetails();
|
|
|
|
|
firstDetail.copy(detail);
|
|
|
|
|
firstDetail.repeats = (detail.repeats! * 1.5).round();
|
|
|
|
|
firstDetail.set = 1;
|
|
|
|
|
detail.set = detail.set! - 1;
|
|
|
|
|
if (detail.set! > 0) {
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
detail.customerTrainingPlanDetailsId = index;
|
|
|
|
|
plan.details.add(firstDetail);
|
|
|
|
|
exerciseTypeIdOrig = detail.exerciseTypeId!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (detail.set! > 0) {
|
|
|
|
|
plan.details.add(detail);
|
|
|
|
|
} */
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Cache().myTrainingPlan = plan;
|
|
|
|
@@ -116,6 +139,68 @@ class TrainingPlanRepository {
|
|
|
|
|
return plan;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<CustomerTrainingPlanDetails> createDetail(CustomerTrainingPlan plan, TrainingPlanDetail elem, int exerciseTypeIdOrig, int index,
|
|
|
|
|
{bool changeExerciseType = false}) {
|
|
|
|
|
List<CustomerTrainingPlanDetails> list = [];
|
|
|
|
|
CustomerTrainingPlanDetails detail = CustomerTrainingPlanDetails();
|
|
|
|
|
detail.customerTrainingPlanDetailsId = ++index;
|
|
|
|
|
detail.trainingPlanDetailsId = elem.trainingPlanDetailId;
|
|
|
|
|
detail.exerciseTypeId = changeExerciseType ? exerciseTypeIdOrig : elem.exerciseTypeId;
|
|
|
|
|
detail.repeats = elem.repeats;
|
|
|
|
|
detail.set = elem.set;
|
|
|
|
|
detail.dayId = elem.dayId;
|
|
|
|
|
TrainingPlanDayRepository trainingPlanDayRepository = TrainingPlanDayRepository();
|
|
|
|
|
detail.day = trainingPlanDayRepository.getNameById(elem.dayId);
|
|
|
|
|
detail.parallel = elem.parallel;
|
|
|
|
|
detail.restingTime = elem.restingTime;
|
|
|
|
|
detail.exerciseType = Cache().getExerciseTypeById(detail.exerciseTypeId!);
|
|
|
|
|
detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId);
|
|
|
|
|
if (elem.weight == -1) {
|
|
|
|
|
if (detail.exerciseType!.unitQuantityUnit != null) {
|
|
|
|
|
detail = getCalculatedWeightRepeats(elem.exerciseTypeId, detail);
|
|
|
|
|
} else {
|
|
|
|
|
detail.weight = 0;
|
|
|
|
|
}
|
|
|
|
|
} else if (elem.weight == -2) {
|
|
|
|
|
final CustomerTrainingPlanDetails calculated = this.isWeightCalculatedByExerciseType(elem.exerciseTypeId, detail, plan);
|
|
|
|
|
if (calculated.weight != -1) {
|
|
|
|
|
detail.weight = calculated.weight;
|
|
|
|
|
} else {
|
|
|
|
|
detail.weight = -2;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
detail.weight = elem.weight;
|
|
|
|
|
}
|
|
|
|
|
print("Detail $detail exerciseType: ${detail.exerciseType!.exerciseTypeId}");
|
|
|
|
|
|
|
|
|
|
detail.state = ExercisePlanDetailState.start;
|
|
|
|
|
if (detail.weight != null && detail.weight! > 0) {
|
|
|
|
|
detail.baseOneRepMax = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// first repeat: 50% more
|
|
|
|
|
if (detail.weight != null && detail.weight! > 0 && exerciseTypeIdOrig != detail.exerciseTypeId && detail.repeats! > 0) {
|
|
|
|
|
CustomerTrainingPlanDetails firstDetail = CustomerTrainingPlanDetails();
|
|
|
|
|
firstDetail.copy(detail);
|
|
|
|
|
firstDetail.repeats = (detail.repeats! * 1.5).round();
|
|
|
|
|
firstDetail.set = 1;
|
|
|
|
|
detail.set = detail.set! - 1;
|
|
|
|
|
if (detail.set! > 0) {
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
detail.customerTrainingPlanDetailsId = index;
|
|
|
|
|
//plan.details.add(firstDetail);
|
|
|
|
|
list.add(firstDetail);
|
|
|
|
|
exerciseTypeIdOrig = detail.exerciseTypeId!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (detail.set! > 0) {
|
|
|
|
|
//plan.details.add(detail);
|
|
|
|
|
list.add(detail);
|
|
|
|
|
}
|
|
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CustomerTrainingPlanDetails isWeightCalculatedByExerciseType(
|
|
|
|
|
int exerciseTypeId, CustomerTrainingPlanDetails detail, CustomerTrainingPlan plan) {
|
|
|
|
|
CustomerTrainingPlanDetails calculated = detail;
|
|
|
|
@@ -172,10 +257,16 @@ class TrainingPlanRepository {
|
|
|
|
|
|
|
|
|
|
Exercise? lastExercise1RM;
|
|
|
|
|
DateTime dt = DateTime.now().subtract(Duration(days: 30));
|
|
|
|
|
Cache().getExercises()!.forEach((exercise) {
|
|
|
|
|
List<Exercise> exercises = Cache().getExercises()!;
|
|
|
|
|
exercises.sort((a, b) {
|
|
|
|
|
// reverse
|
|
|
|
|
return a.dateAdd!.compareTo(b.dateAdd!);
|
|
|
|
|
});
|
|
|
|
|
exercises.forEach((exercise) {
|
|
|
|
|
if (exercise.exerciseTypeId == exerciseTypeId && exercise.dateAdd!.compareTo(dt) >= 0) {
|
|
|
|
|
detail.weight = weight;
|
|
|
|
|
lastExercise1RM = exercise;
|
|
|
|
|
print("last exercise: $exercise");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@@ -185,7 +276,8 @@ class TrainingPlanRepository {
|
|
|
|
|
return detail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double oneRepMax = Common.calculate1RM(lastExercise1RM!.unitQuantity!, lastExercise1RM!.quantity!);
|
|
|
|
|
double oneRepMax = calculateMax1RMSameDay(lastExercise1RM!);
|
|
|
|
|
// Common.calculate1RM(lastExercise1RM!.unitQuantity!, lastExercise1RM!.quantity!);
|
|
|
|
|
print("Exercise $exerciseTypeId - 1RM : $oneRepMax");
|
|
|
|
|
weight = oneRepMax * Common.get1RMPercent(detail.repeats!);
|
|
|
|
|
print("Exercise $exerciseTypeId - weight : $weight");
|
|
|
|
@@ -201,6 +293,25 @@ class TrainingPlanRepository {
|
|
|
|
|
return detail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double calculateMax1RMSameDay(Exercise actual) {
|
|
|
|
|
List<Exercise> exercises = Cache().getExercises()!;
|
|
|
|
|
double max1RM = 0.0;
|
|
|
|
|
|
|
|
|
|
exercises.forEach((exercise) {
|
|
|
|
|
if (actual.exerciseTypeId == exercise.exerciseTypeId &&
|
|
|
|
|
actual.dateAdd!.year == exercise.dateAdd!.year &&
|
|
|
|
|
actual.dateAdd!.month == exercise.dateAdd!.month &&
|
|
|
|
|
actual.dateAdd!.day == exercise.dateAdd!.day) {
|
|
|
|
|
double oneRepMax = Common.calculate1RM(exercise.unitQuantity!, exercise.quantity!);
|
|
|
|
|
if (max1RM < oneRepMax) {
|
|
|
|
|
max1RM = oneRepMax;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return max1RM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int getOriginalRepeats(int trainingPlanId, CustomerTrainingPlanDetails detail) {
|
|
|
|
|
TrainingPlan? plan = getTrainingPlanById(trainingPlanId);
|
|
|
|
|
if (plan == null) {
|
|
|
|
|