package io.omido.tabrizonline.di
import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import okhttp3.Cache
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module.module
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import timber.log.Timber
import java.io.File
import java.util.concurrent.TimeUnit
private const val LOGGING_INTERCEPTOR = "Logging Interceptor"
private const val API_INTERCEPTOR = "API Interceptor"
private const val USER_AGENT_INTERCEPTOR = "User Agent Interceptor"
private const val CACHE_FILE = "Cache File"
private const val CACHE_NAME = "okhttp_cache"
private const val CACHE_SIZE = (5 * 1024 * 1024L)
//private const val BASE_URL = "http://10.0.2.2/TabrizOnline/Web/tabriz-online/public/api/"
private const val BASE_URL = "http://app.anilaserv.ir/api/"
private const val API_KEY = "X-API-KEY"
private const val API_KEY_VALUE = "4B2530DB288AD727084BE9E91E0CEC32C4298C84"
private const val USER_AGENT = "User-Agent"
private const val USER_AGENT_VALUE = "Android Client"
val networkModule = module {
factory(CACHE_FILE) {
File(androidContext().cacheDir, CACHE_NAME).apply {
if (!exists()) mkdir()
}
}
factory { Cache(get(CACHE_FILE), CACHE_SIZE) }
factory<Interceptor>(LOGGING_INTERCEPTOR) {
HttpLoggingInterceptor { log ->
Timber.d(log)
}.apply {
level = HttpLoggingInterceptor.Level.BODY
}
}
factory(API_INTERCEPTOR) {
Interceptor { chain ->
val request = chain.request().newBuilder()
.addHeader(API_KEY, API_KEY_VALUE)
.build()
return@Interceptor chain.proceed(request)
}
}
factory(USER_AGENT_INTERCEPTOR) {
Interceptor { chain ->
val request = chain.request().newBuilder()
.addHeader(USER_AGENT, USER_AGENT_VALUE)
.build()
return@Interceptor chain.proceed(request)
}
}
single<OkHttpClient> {
OkHttpClient.Builder()
.addInterceptor(get(API_INTERCEPTOR))
.addInterceptor(get(USER_AGENT_INTERCEPTOR))
.addInterceptor(get(LOGGING_INTERCEPTOR))
.cache(get())
.callTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build()
}
single<Retrofit> {
Retrofit.Builder()
.baseUrl(BASE_URL)
.client(get())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}