package de.avalax.fitbuddy.application.edit.workout;
import java.util.Collection;
import java.util.List;
import de.avalax.fitbuddy.application.workout.WorkoutSession;
import de.avalax.fitbuddy.domain.model.ResourceException;
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseException;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkoutRepository;
import de.avalax.fitbuddy.domain.model.set.Set;
import de.avalax.fitbuddy.domain.model.set.SetException;
import de.avalax.fitbuddy.domain.model.set.SetRepository;
import de.avalax.fitbuddy.domain.model.workout.BasicWorkout;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutException;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
import de.avalax.fitbuddy.domain.model.workout.WorkoutListEntry;
import de.avalax.fitbuddy.domain.model.workout.WorkoutParseException;
import de.avalax.fitbuddy.domain.model.workout.WorkoutParserService;
import de.avalax.fitbuddy.domain.model.workout.WorkoutRepository;
public class EditWorkoutApplicationService {
private FinishedWorkoutRepository finishedWorkoutRepository;
private WorkoutRepository workoutRepository;
private ExerciseRepository exerciseRepository;
private SetRepository setRepository;
private WorkoutParserService workoutParserService;
private WorkoutSession workoutSession;
@Deprecated
private boolean unsavedChanges;
@Deprecated
private Workout deletedWorkout;
private Workout.WorkoutMemento memento;
public EditWorkoutApplicationService(
WorkoutSession workoutSession,
FinishedWorkoutRepository finishedWorkoutRepository,
WorkoutRepository workoutRepository,
ExerciseRepository exerciseRepository,
SetRepository setRepository,
WorkoutParserService workoutParserService) {
this.workoutSession = workoutSession;
this.finishedWorkoutRepository = finishedWorkoutRepository;
this.workoutRepository = workoutRepository;
this.exerciseRepository = exerciseRepository;
this.setRepository = setRepository;
this.workoutParserService = workoutParserService;
}
private void setUnsavedChanges(boolean unsavedChanges) {
this.unsavedChanges = unsavedChanges;
}
public boolean hasUnsavedChanges() {
return unsavedChanges;
}
public Workout loadWorkout(WorkoutId id) throws WorkoutException {
return workoutRepository.load(id);
}
public void switchWorkout(Workout workout) throws WorkoutException {
if (workoutSession.hasWorkout()) {
Workout workoutToSave = workoutSession.getWorkout();
finishedWorkoutRepository.saveWorkout(workoutToSave);
}
workoutSession.switchWorkout(workout);
setUnsavedChanges(false);
}
public List<WorkoutListEntry> getWorkoutList() {
return workoutRepository.getWorkoutList();
}
public Workout createWorkout() {
Workout workout = new BasicWorkout();
workoutRepository.save(workout);
setUnsavedChanges(false);
return workout;
}
public Workout createWorkoutFromJson(String json) throws WorkoutParseException {
Workout workoutFromJson = workoutParserService.workoutFromJson(json);
workoutRepository.save(workoutFromJson);
setUnsavedChanges(false);
return workoutFromJson;
}
public void deleteWorkout(Workout workout) {
workoutRepository.delete(workout.getWorkoutId());
memento = null;
setUnsavedChanges(workout);
}
private void setUnsavedChanges(Workout workout) {
deletedWorkout = workout;
setUnsavedChanges(true);
}
public void undoDeleteExercise(Workout workout) {
workout.setMemento(memento);
workoutRepository.save(workout);
memento = null;
setUnsavedChanges(false);
}
public Workout undoDeleteWorkout() {
Workout restoredWorkout = deletedWorkout;
workoutRepository.save(restoredWorkout);
deletedWorkout = null;
setUnsavedChanges(false);
return restoredWorkout;
}
public void deleteExercises(Workout workout, Collection<Integer> positions)
throws ExerciseException {
deletedWorkout = null;
memento = workout.createMemento();
setUnsavedChanges(true);
for (Integer position : positions) {
Exercise exercise = workout.getExercises().get(position);
exerciseRepository.delete(exercise.getExerciseId());
workout.getExercises().delete(exercise);
}
}
public void saveExercise(WorkoutId workoutId, Exercise exercise, int position) {
exerciseRepository.save(workoutId, position, exercise);
setUnsavedChanges(false);
}
public void createExercise(Workout workout) {
Exercise exercise = workout.getExercises().createExercise();
int countOfExercises = workout.getExercises().size();
exerciseRepository.save(workout.getWorkoutId(), countOfExercises - 1, exercise);
setUnsavedChanges(false);
}
public boolean hasDeletedWorkout() {
return deletedWorkout != null;
}
public boolean hasDeletedExercise() {
return memento != null;
}
public void changeName(Workout workout, String name) {
workout.setName(name);
workoutRepository.save(workout);
setUnsavedChanges(false);
}
public void changeSetAmount(Exercise exercise, int amount) throws ResourceException {
int countOfSets = exercise.getSets().size();
if (amount == countOfSets) {
return;
}
if (amount < countOfSets) {
for (int i = 0; i < countOfSets - amount; i++) {
Set set = exercise.getSets().get(i);
exercise.getSets().remove(set);
setRepository.delete(set.getSetId());
}
} else {
double weight;
int maxReps;
try {
int indexOfCurrentSet = exercise.getSets().indexOfCurrentSet();
Set set = exercise.getSets().get(indexOfCurrentSet);
weight = set.getWeight();
maxReps = set.getMaxReps();
} catch (SetException e) {
weight = 0;
maxReps = 0;
}
for (int i = 0; i < amount - countOfSets; i++) {
Set set = exercise.getSets().createSet();
set.setMaxReps(maxReps);
set.setWeight(weight);
setRepository.save(exercise.getExerciseId(), set);
}
}
setUnsavedChanges(false);
}
public void moveExerciseAtPositionUp(Workout workout, int position) throws ResourceException {
if (workout.getExercises().moveExerciseAtPositionUp(position)) {
workoutRepository.save(workout);
}
setUnsavedChanges(false);
}
public void moveExerciseAtPositionDown(Workout workout, int position) throws ResourceException {
if (workout.getExercises().moveExerciseAtPositionDown(position)) {
workoutRepository.save(workout);
}
setUnsavedChanges(false);
}
}