package com.elifut;

import android.content.Context;
import android.os.Build;

import com.elifut.services.ElifutService;

import java.io.File;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import okhttp3.Cache;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import okreplay.OkReplayInterceptor;
import retrofit2.CallAdapter;
import retrofit2.Converter;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;

@Module
public class NetworkModule {
  private final Context context;

  public NetworkModule(Context context) {
    this.context = context;
  }

  @Provides @Singleton ElifutService provideService(Retrofit retrofit) {
    return retrofit.create(ElifutService.class);
  }

  @Provides @Singleton Retrofit provideRetrofit(OkHttpClient client, HttpUrl baseUrl,
      Executor callbackExecutor, Converter.Factory converterFactory, CallAdapter.Factory factory) {
    return new Retrofit.Builder()
        .baseUrl(baseUrl)
        .client(client)
        .callbackExecutor(callbackExecutor)
        .addCallAdapterFactory(factory)
        .addConverterFactory(converterFactory)
        .build();
  }

  @Provides @Singleton Executor provideExecutor() {
    return new ConcurrentUtil.MainThreadExecutor();
  }

  @Provides @Singleton OkReplayInterceptor provideOkReplayInterceptor() {
    return OkReplayInterceptorProvider.Companion.getInstance();
  }

  @Provides @Singleton CallAdapter.Factory provideCallAdapterFactory() {
    return RxJavaCallAdapterFactory.create();
  }

  @Provides @Singleton HttpUrl provideBaseUrl() {
    return HttpUrl.parse(BuildConfig.API_ENDPOINT);
  }

  @Provides @Singleton Cache provideCache() {
    File cacheDir = new File(context.getCacheDir(), "okhttp");
    long maxSize = 20L * 1024 * 1024;
    return new Cache(cacheDir, maxSize);
  }

  @Provides @Singleton static OkHttpClient provideOkHttpClient(Cache cache,
      OkReplayInterceptor okReplayInterceptor) {
    OkHttpClient.Builder builder = new OkHttpClient.Builder()
        .readTimeout(15, TimeUnit.SECONDS)
        .connectTimeout(15, TimeUnit.SECONDS)
        .cache(cache)
        .addInterceptor(okReplayInterceptor);
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BASIC :
        HttpLoggingInterceptor.Level.NONE);
    builder.addInterceptor(logging);
    StethoInitializer.addInterceptor(builder.networkInterceptors());
    return builder.build();
  }
}