package de.avalax.fitbuddy.port.adapter.persistence;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.finished_exercise.FinishedExercise;
import de.avalax.fitbuddy.domain.model.finished_exercise.FinishedExerciseRepository;
import de.avalax.fitbuddy.domain.model.finished_workout.BasicFinishedWorkout;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkout;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkoutId;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkoutException;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkoutRepository;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
public class SQLiteFinishedWorkoutRepository implements FinishedWorkoutRepository {
private static final String TABLE_FINISHED_WORKOUT = "finished_workout";
private SQLiteOpenHelper sqLiteOpenHelper;
private FinishedExerciseRepository finishedExerciseRepository;
public SQLiteFinishedWorkoutRepository(
SQLiteOpenHelper sqLiteOpenHelper,
FinishedExerciseRepository finishedExerciseRepository) {
this.sqLiteOpenHelper = sqLiteOpenHelper;
this.finishedExerciseRepository = finishedExerciseRepository;
}
@Override
public FinishedWorkoutId saveWorkout(Workout workout) {
SQLiteDatabase database = sqLiteOpenHelper.getWritableDatabase();
long id = database.insertOrThrow(TABLE_FINISHED_WORKOUT, null, getContentValues(workout));
FinishedWorkoutId finishedWorkoutId = new FinishedWorkoutId(String.valueOf(id));
for (Exercise exercise : workout.getExercises()) {
finishedExerciseRepository.save(finishedWorkoutId, exercise);
}
database.close();
return finishedWorkoutId;
}
@Override
public FinishedWorkout load(FinishedWorkoutId finishedWorkoutId)
throws FinishedWorkoutException {
if (finishedWorkoutId == null) {
throw new FinishedWorkoutException();
}
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
String[] columns = {"id", "workout_id", "name", "created"};
String[] args = {finishedWorkoutId.getId()};
Cursor cursor = database.query(TABLE_FINISHED_WORKOUT, columns,
"id=?", args, null, null, null);
if (cursor.moveToFirst()) {
FinishedWorkout finishedWorkout = createFinishedWorkout(cursor);
cursor.close();
database.close();
return finishedWorkout;
} else {
cursor.close();
database.close();
throw new FinishedWorkoutException();
}
}
@Override
public List<FinishedWorkout> loadAll() {
List<FinishedWorkout> finishedWorkouts = new ArrayList<>();
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
String[] columns = {"id", "workout_id", "name", "created"};
Cursor cursor = database.query(TABLE_FINISHED_WORKOUT, columns,
null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
finishedWorkouts.add(createFinishedWorkout(cursor));
} while (cursor.moveToNext());
cursor.close();
database.close();
}
return finishedWorkouts;
}
private FinishedWorkout createFinishedWorkout(Cursor cursor) {
FinishedWorkoutId finishedWorkoutId = new FinishedWorkoutId(cursor.getString(0));
WorkoutId workoutId = new WorkoutId(cursor.getString(1));
List<FinishedExercise> exercises = addFinishedExercises(finishedWorkoutId);
String name = cursor.getString(2);
String created = cursor.getString(3);
return new BasicFinishedWorkout(finishedWorkoutId, workoutId, name, created, exercises);
}
private List<FinishedExercise> addFinishedExercises(FinishedWorkoutId finishedWorkoutId) {
return finishedExerciseRepository.allSetsBelongsTo(finishedWorkoutId);
}
private ContentValues getContentValues(Workout workout) {
ContentValues values = new ContentValues();
values.put("name", workout.getName());
if (workout.getWorkoutId() != null) {
String workoutId = workout.getWorkoutId().getId();
values.put("workout_id", workoutId);
}
return values;
}
}