package de.avalax.fitbuddy.presentation;
import android.content.Context;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.Locale;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import de.avalax.fitbuddy.R;
import de.avalax.fitbuddy.application.edit.workout.EditWorkoutApplicationService;
import de.avalax.fitbuddy.application.summary.FinishedWorkoutApplicationService;
import de.avalax.fitbuddy.application.workout.WorkoutApplicationService;
import de.avalax.fitbuddy.application.workout.WorkoutSession;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository;
import de.avalax.fitbuddy.domain.model.finished_exercise.FinishedExerciseRepository;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkoutRepository;
import de.avalax.fitbuddy.domain.model.set.SetRepository;
import de.avalax.fitbuddy.domain.model.workout.WorkoutParserService;
import de.avalax.fitbuddy.domain.model.workout.WorkoutRepository;
import de.avalax.fitbuddy.port.adapter.persistence.FitbuddySQLiteOpenHelper;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteExerciseRepository;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteFinishedExerciseRepository;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteFinishedWorkoutRepository;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteSetRepository;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteWorkoutRepository;
import de.avalax.fitbuddy.port.adapter.service.JsonToWorkoutAdapter;
import de.avalax.fitbuddy.port.adapter.service.WorkoutParserJsonService;
import de.avalax.fitbuddy.port.adapter.service.WorkoutToJsonAdapter;
import de.avalax.fitbuddy.presentation.helper.ExerciseViewHelper;
@Module
public class FitbuddyModule {
private Context context;
public FitbuddyModule(Context context) {
this.context = context;
}
@Provides
@Singleton
WorkoutSession provideWorkoutSession() {
return new WorkoutSession(context);
}
@Provides
@Singleton
SQLiteOpenHelper provideSQLiteOpenHelper() {
return new FitbuddySQLiteOpenHelper("fitbuddy", 1, context, R.raw.fitbuddy_db);
}
@Provides
@Singleton
WorkoutRepository provideWorkoutRepository(
SQLiteOpenHelper sqLiteOpenHelper,
ExerciseRepository exerciseRepository) {
return new SQLiteWorkoutRepository(sqLiteOpenHelper, exerciseRepository);
}
@Provides
@Singleton
ExerciseRepository provideExerciseRepository(
SQLiteOpenHelper sqLiteOpenHelper,
SetRepository setRepository) {
return new SQLiteExerciseRepository(sqLiteOpenHelper, setRepository);
}
@Provides
@Singleton
SetRepository provideSetRepository(
SQLiteOpenHelper sqLiteOpenHelper) {
return new SQLiteSetRepository(sqLiteOpenHelper);
}
@Provides
@Singleton
FinishedWorkoutRepository provideFinishWorkoutRepository(
SQLiteOpenHelper sqLiteOpenHelper,
FinishedExerciseRepository finishedExerciseRepository) {
return new SQLiteFinishedWorkoutRepository(sqLiteOpenHelper, finishedExerciseRepository);
}
@Provides
@Singleton
FinishedExerciseRepository provideFinishedExerciseRepository(
SQLiteOpenHelper sqLiteOpenHelper) {
return new SQLiteFinishedExerciseRepository(sqLiteOpenHelper);
}
@Provides
@Singleton
WorkoutApplicationService provideWorkoutApplicationService(
WorkoutSession workoutSession,
WorkoutRepository workoutRepository,
FinishedWorkoutRepository finishedWorkoutRepository) {
return new WorkoutApplicationService(
workoutSession,
workoutRepository,
finishedWorkoutRepository);
}
@Provides
@Singleton
FinishedWorkoutApplicationService provideFinishedWorkoutApplicationService(
FinishedWorkoutRepository finishedWorkoutRepository) {
return new FinishedWorkoutApplicationService(finishedWorkoutRepository);
}
@Provides
@Singleton
ExerciseViewHelper provideExerciseViewHelper() {
Locale locale = context.getResources().getConfiguration().locale;
return new ExerciseViewHelper(locale);
}
@Provides
@Singleton
WorkoutParserService provideWorkoutService() {
JsonToWorkoutAdapter jsonToWorkoutAdapter = new JsonToWorkoutAdapter();
WorkoutToJsonAdapter workoutToJsonAdapter = new WorkoutToJsonAdapter();
return new WorkoutParserJsonService(jsonToWorkoutAdapter, workoutToJsonAdapter);
}
@Provides
@Singleton
EditWorkoutApplicationService provideManageWorkout(
WorkoutSession workoutSession,
FinishedWorkoutRepository finishedWorkoutRepository,
WorkoutRepository workoutRepository,
ExerciseRepository exerciseRepository,
SetRepository setRepository,
WorkoutParserService workoutParserService) {
return new EditWorkoutApplicationService(
workoutSession,
finishedWorkoutRepository,
workoutRepository,
exerciseRepository,
setRepository,
workoutParserService);
}
}