package com.parkplants.di import android.content.Context import androidx.room.Room import com.parkplants.BuildConfig import com.parkplants.data.api.ApiService import com.parkplants.data.api.AuthInterceptor import com.parkplants.data.db.AppDatabase import com.parkplants.data.db.dao.CachedNurseryDao import com.parkplants.data.db.dao.CachedPlantTypeDao import com.parkplants.data.db.dao.PendingPlantDao import com.parkplants.data.db.dao.PlantTypeColorDao import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object AppModule { @Provides @Singleton fun provideOkHttpClient(authInterceptor: AuthInterceptor): OkHttpClient = OkHttpClient.Builder() .addInterceptor(authInterceptor) .addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }) .build() @Provides @Singleton fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit = Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build() @Provides @Singleton fun provideApiService(retrofit: Retrofit): ApiService = retrofit.create(ApiService::class.java) @Provides @Singleton fun provideBaseUrl(): String = BuildConfig.BASE_URL @Provides @Singleton fun provideDatabase(@ApplicationContext context: Context): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, "park_plants.db") .fallbackToDestructiveMigration() .build() @Provides fun providePendingPlantDao(db: AppDatabase): PendingPlantDao = db.pendingPlantDao() @Provides fun provideCachedPlantTypeDao(db: AppDatabase): CachedPlantTypeDao = db.cachedPlantTypeDao() @Provides fun provideCachedNurseryDao(db: AppDatabase): CachedNurseryDao = db.cachedNurseryDao() @Provides fun providePlantTypeColorDao(db: AppDatabase): PlantTypeColorDao = db.plantTypeColorDao() }