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.exercise.ExerciseRepository;
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.WorkoutRepository;
public class SQLiteWorkoutRepository implements WorkoutRepository {
private static final String TABLE_WORKOUT = "workout";
private SQLiteOpenHelper sqLiteOpenHelper;
private ExerciseRepository exerciseRepository;
public SQLiteWorkoutRepository(
SQLiteOpenHelper sqLiteOpenHelper,
ExerciseRepository exerciseRepository) {
this.sqLiteOpenHelper = sqLiteOpenHelper;
this.exerciseRepository = exerciseRepository;
}
@Override
public void save(Workout workout) {
SQLiteDatabase database = sqLiteOpenHelper.getWritableDatabase();
if (workout.getWorkoutId() == null) {
long id = database.insertOrThrow(TABLE_WORKOUT, null, getContentValues(workout));
workout.setWorkoutId(new WorkoutId(String.valueOf(id)));
} else {
String[] args = {workout.getWorkoutId().getId()};
database.update(TABLE_WORKOUT, getContentValues(workout), "id=?", args);
}
database.close();
int position = 1;
for (Exercise exercise : workout.getExercises()) {
exerciseRepository.save(workout.getWorkoutId(), position, exercise);
position++;
}
}
private ContentValues getContentValues(Workout workout) {
ContentValues values = new ContentValues();
values.put("name", workout.getName());
return values;
}
@Override
public Workout load(WorkoutId workoutId) throws WorkoutException {
if (workoutId == null) {
throw new WorkoutException();
}
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
Cursor cursor = database.query(TABLE_WORKOUT, new String[]{"id", "name"},
"id=?", new String[]{workoutId.getId()}, null, null, null);
if (cursor.moveToFirst()) {
Workout workout = createWorkout(cursor);
cursor.close();
database.close();
return workout;
} else {
cursor.close();
database.close();
throw new WorkoutException();
}
}
private Workout createWorkout(Cursor cursor) {
WorkoutId workoutId = new WorkoutId(cursor.getString(0));
List<Exercise> exercises = exerciseRepository.allExercisesBelongsTo(workoutId);
return new BasicWorkout(workoutId, cursor.getString(1), exercises);
}
@Override
public List<WorkoutListEntry> getWorkoutList() {
List<WorkoutListEntry> workoutList = new ArrayList<>();
SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase();
Cursor cursor = database.query(TABLE_WORKOUT, new String[]{"id", "name"},
null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
WorkoutId workoutId = new WorkoutId(cursor.getString(0));
String name = cursor.getString(1);
WorkoutListEntry entry = new WorkoutListEntry(workoutId, name);
workoutList.add(entry);
} while (cursor.moveToNext());
}
cursor.close();
database.close();
return workoutList;
}
@Override
public void delete(WorkoutId workoutId) {
if (workoutId == null) {
return;
}
SQLiteDatabase database = sqLiteOpenHelper.getWritableDatabase();
database.delete(TABLE_WORKOUT, "id=" + workoutId.getId(), null);
database.close();
}
}