package de.avalax.fitbuddy.domain.model.workout;
import java.util.ArrayList;
import java.util.List;
import de.avalax.fitbuddy.domain.model.ResourceException;
import de.avalax.fitbuddy.domain.model.exercise.BasicExercises;
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.exercise.Exercises;
public class BasicWorkout implements Workout {
private Exercises exercises;
private String name;
private WorkoutId workoutId;
public BasicWorkout(WorkoutId workoutId, String name, List<Exercise> exercises) {
this.workoutId = workoutId;
this.exercises = new BasicExercises(exercises);
this.name = name;
}
public BasicWorkout() {
this.exercises = new BasicExercises(new ArrayList<Exercise>());
this.name = "";
}
@Override
public WorkoutId getWorkoutId() {
return workoutId;
}
@Override
public void setWorkoutId(WorkoutId workoutId) {
this.workoutId = workoutId;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
if (name == null) {
this.name = "";
} else {
this.name = name.trim();
}
}
@Override
public double getProgress(int position) throws ResourceException {
Exercise exercise = exercises.get(position);
return (position + exercise.getProgress()) / exercises.size();
}
@Override
public Exercises getExercises() {
return exercises;
}
@Override
public WorkoutMemento createMemento() {
return new BasicWorkoutMemento(exercises);
}
@Override
public void setMemento(WorkoutMemento memento) {
if (memento != null) {
this.exercises = memento.getExercises();
}
}
@Override
public String toString() {
if (workoutId == null) {
return "BasicWorkout [name=" + name + "]";
}
return "BasicWorkout [name=" + name + ", workoutId=" + workoutId.toString() + "]";
}
@Override
public boolean equals(Object o) {
if (workoutId == null) {
return super.equals(o);
}
return o instanceof Workout && workoutId.equals(((Workout) o).getWorkoutId());
}
@Override
public int hashCode() {
if (workoutId == null) {
return super.hashCode();
}
return workoutId.hashCode();
}
private static class BasicWorkoutMemento implements WorkoutMemento {
private final BasicExercises exercises;
BasicWorkoutMemento(Exercises exercises) {
List<Exercise> exerciseList = new ArrayList<>();
for (Exercise exercise : exercises) {
exerciseList.add(exercise);
}
this.exercises = new BasicExercises(exerciseList);
}
@Override
public Exercises getExercises() {
return exercises;
}
}
}