package ru.ltst.u2020mvp.data.api;
import com.f2prateek.rx.preferences.Preference;
import javax.inject.Named;
import dagger.Module;
import dagger.Provides;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.mock.MockRetrofit;
import retrofit2.mock.NetworkBehavior;
import ru.ltst.u2020mvp.ApplicationScope;
import ru.ltst.u2020mvp.data.ApiEndpoint;
import ru.ltst.u2020mvp.data.IsMockMode;
import ru.ltst.u2020mvp.data.NetworkDelay;
import ru.ltst.u2020mvp.data.NetworkFailurePercent;
import ru.ltst.u2020mvp.data.NetworkVariancePercent;
import ru.ltst.u2020mvp.data.api.mock.MockGalleryService;
import ru.ltst.u2020mvp.data.api.mock.MockImageService;
import timber.log.Timber;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
@Module(includes = ApiModule.class)
public final class DebugApiModule {
@Provides
@ApplicationScope
HttpUrl provideHttpUrl(@ApiEndpoint Preference<String> apiEndpoint) {
return HttpUrl.parse(apiEndpoint.get());
}
@Provides
@ApplicationScope
CurlLoggingInterceptor provideCurlLoggingInterceptor() {
return new CurlLoggingInterceptor(message -> Timber.tag("Curl").v(message));
}
@Provides
@ApplicationScope
HttpLoggingInterceptor provideLoggingInterceptor() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(message -> Timber.tag("OkHttp").v(message));
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
return loggingInterceptor;
}
@Provides
@ApplicationScope
@Named("Api")
OkHttpClient provideApiClient(OkHttpClient client,
HttpLoggingInterceptor loggingInterceptor,
CurlLoggingInterceptor curlLoggingInterceptor,
ApiHeaders apiHeaders) {
return ApiModule.createApiClient(client, apiHeaders)
.addInterceptor(loggingInterceptor)
.addInterceptor(curlLoggingInterceptor)
.build();
}
@Provides
@ApplicationScope
NetworkBehavior provideBehavior(@NetworkDelay Preference<Long> networkDelay,
@NetworkFailurePercent Preference<Integer> networkFailurePercent,
@NetworkVariancePercent Preference<Integer> networkVariancePercent) {
NetworkBehavior behavior = NetworkBehavior.create();
behavior.setDelay(networkDelay.get(), MILLISECONDS);
behavior.setFailurePercent(networkFailurePercent.get());
behavior.setVariancePercent(networkVariancePercent.get());
return behavior;
}
@Provides
@ApplicationScope
MockRetrofit provideMockRetrofit(Retrofit retrofit, NetworkBehavior behavior) {
return new MockRetrofit.Builder(retrofit)
.networkBehavior(behavior)
.build();
}
@Provides
@ApplicationScope
GalleryService provideGalleryService(Retrofit retrofit,
@IsMockMode boolean isMockMode,
MockGalleryService mockGalleryService) {
return isMockMode ? mockGalleryService : retrofit.create(GalleryService.class);
}
@Provides
@ApplicationScope
ImageService provideImageService(Retrofit retrofit,
@IsMockMode boolean isMockMode,
MockImageService mockImageService) {
return isMockMode ? mockImageService : retrofit.create(ImageService.class);
}
}