app/src/main/java/com/codingblocks/cbonlineapp/di/Modules.kt
package com.codingblocks.cbonlineapp.di
import android.app.Application
import androidx.lifecycle.SavedStateHandle
import androidx.room.Room
import com.codingblocks.cbonlineapp.admin.doubts.AdminDoubtRepository
import com.codingblocks.cbonlineapp.admin.doubts.AdminDoubtsViewModel
import com.codingblocks.cbonlineapp.admin.overview.AdminOverviewRepository
import com.codingblocks.cbonlineapp.admin.overview.AdminOverviewViewModel
import com.codingblocks.cbonlineapp.auth.AuthRepository
import com.codingblocks.cbonlineapp.auth.AuthViewModel
import com.codingblocks.cbonlineapp.campaign.CampaignRepository
import com.codingblocks.cbonlineapp.campaign.CampaignViewModel
import com.codingblocks.cbonlineapp.course.CourseRepository
import com.codingblocks.cbonlineapp.course.CourseViewModel
import com.codingblocks.cbonlineapp.course.checkout.CheckoutViewModel
import com.codingblocks.cbonlineapp.dashboard.DashboardViewModel
import com.codingblocks.cbonlineapp.dashboard.doubts.DashboardDoubtsRepository
import com.codingblocks.cbonlineapp.dashboard.doubts.DashboardDoubtsViewModel
import com.codingblocks.cbonlineapp.dashboard.home.DashboardHomeRepository
import com.codingblocks.cbonlineapp.dashboard.home.WishlistViewModel
import com.codingblocks.cbonlineapp.dashboard.mycourses.DashboardMyCoursesRepository
import com.codingblocks.cbonlineapp.database.AppDatabase
import com.codingblocks.cbonlineapp.jobs.JobsViewModel
import com.codingblocks.cbonlineapp.jobs.jobdetails.JobDetailViewModel
import com.codingblocks.cbonlineapp.jobs.jobdetails.JobRepository
import com.codingblocks.cbonlineapp.library.LibraryRepository
import com.codingblocks.cbonlineapp.library.LibraryViewModel
import com.codingblocks.cbonlineapp.mycourse.MyCourseRepository
import com.codingblocks.cbonlineapp.mycourse.MyCourseViewModel
import com.codingblocks.cbonlineapp.mycourse.content.codechallenge.CodeChallengeRepository
import com.codingblocks.cbonlineapp.mycourse.content.codechallenge.CodeChallengeViewModel
import com.codingblocks.cbonlineapp.mycourse.content.document.PdfActivityRepository
import com.codingblocks.cbonlineapp.mycourse.content.document.PdfViewModel
import com.codingblocks.cbonlineapp.mycourse.content.player.VideoPlayerRepository
import com.codingblocks.cbonlineapp.mycourse.content.player.VideoPlayerViewModel
import com.codingblocks.cbonlineapp.mycourse.content.quiz.QuizRepository
import com.codingblocks.cbonlineapp.mycourse.content.quiz.QuizViewModel
import com.codingblocks.cbonlineapp.notifications.NotificationViewModel
import com.codingblocks.cbonlineapp.profile.ProfileRepository
import com.codingblocks.cbonlineapp.profile.ProfileViewModel
import com.codingblocks.cbonlineapp.settings.SettingsViewModel
import com.codingblocks.cbonlineapp.tracks.TrackViewModel
import com.codingblocks.cbonlineapp.tracks.TracksRepository
import com.codingblocks.cbonlineapp.util.PreferenceHelper
import com.google.firebase.firestore.FirebaseFirestore
import org.koin.android.ext.koin.androidApplication
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
val viewModelModule = module {
viewModel { (handle: SavedStateHandle) -> MyCourseViewModel(handle, get(), get()) }
viewModel { NotificationViewModel(get()) }
viewModel { (handle: SavedStateHandle) -> VideoPlayerViewModel(handle, get(), get(), get()) }
viewModel { SettingsViewModel(get()) }
viewModel { JobsViewModel(get()) }
viewModel { JobDetailViewModel(get(), get()) }
viewModel { AdminDoubtsViewModel(get()) }
viewModel { AdminOverviewViewModel(get(), get()) }
viewModel { DashboardDoubtsViewModel(get()) }
viewModel { CourseViewModel(get(), get()) }
viewModel { (handle: SavedStateHandle) -> LibraryViewModel(handle, get(), get()) }
viewModel { (handle: SavedStateHandle) -> DashboardViewModel(handle, get(), get(), get(), get(), get()) }
viewModel { QuizViewModel(get()) }
viewModel { CheckoutViewModel() }
viewModel { TrackViewModel(get()) }
viewModel { ProfileViewModel(get()) }
viewModel { WishlistViewModel() }
viewModel { (handle: SavedStateHandle) -> AuthViewModel(handle, get()) }
viewModel { (handle: SavedStateHandle) -> CodeChallengeViewModel(handle, get()) }
viewModel { (handle: SavedStateHandle) -> CampaignViewModel(handle, get()) }
viewModel { (handle: SavedStateHandle) -> PdfViewModel(handle, get()) }
single { AdminDoubtRepository() }
single { AdminOverviewRepository() }
single { CourseRepository() }
single { DashboardDoubtsRepository(get(), get(), get(), get()) }
single { DashboardMyCoursesRepository(get(), get(), get(), get(), get()) }
single { LibraryRepository(get(), get(), get(), get(), get()) }
single { DashboardHomeRepository(get(), get(), get(), get()) }
single { VideoPlayerRepository(get(), get(), get(), get(), get(), get()) }
single { QuizRepository(get(), get()) }
single { JobRepository(get()) }
single { MyCourseRepository(get(), get(), get(), get(), get(), get(), get(), get()) }
single { TracksRepository() }
single { ProfileRepository(get()) }
single { CodeChallengeRepository(get(), get()) }
single { AuthRepository(get()) }
single { CampaignRepository(get()) }
single { PdfActivityRepository(get(), get()) }
}
val preferencesModule = module {
single { provideSettingsPreferences(androidApplication()) }
}
val firebaseModule = module {
single { FirebaseFirestore.getInstance() }
}
fun provideSettingsPreferences(app: Application): PreferenceHelper = PreferenceHelper.getPrefs(app)
val databaseModule = module {
single {
Room.databaseBuilder(
androidApplication(),
AppDatabase::class.java, "online-app-database"
)
.fallbackToDestructiveMigration()
.build()
}
factory {
val database: AppDatabase = get()
database.doubtsDao()
}
factory {
val database: AppDatabase = get()
database.bookmarkDao()
}
factory {
val database: AppDatabase = get()
database.notesDao()
}
factory {
val database: AppDatabase = get()
database.libraryDao()
}
factory {
val database: AppDatabase = get()
database.courseDao()
}
factory {
val database: AppDatabase = get()
database.instructorDao()
}
factory {
val database: AppDatabase = get()
database.runPerformanceDao()
}
factory {
val database: AppDatabase = get()
database.courseWithInstructorDao()
}
factory {
val database: AppDatabase = get()
database.sectionDao()
}
factory {
val database: AppDatabase = get()
database.contentDao()
}
factory {
val database: AppDatabase = get()
database.codeChallengeDao()
}
factory {
val database: AppDatabase = get()
database.sectionWithContentsDao()
}
factory {
val database: AppDatabase = get()
database.notificationDao()
}
factory {
val database: AppDatabase = get()
database.jobsDao()
}
factory {
val database: AppDatabase = get()
database.commentsDao()
}
factory {
val database: AppDatabase = get()
database.runDao()
}
factory {
val database: AppDatabase = get()
database.runAttemptDao()
}
factory {
val database: AppDatabase = get()
database.runWithAttemptDao()
}
factory {
val database: AppDatabase = get()
database.playerDao()
}
factory {
val database: AppDatabase = get()
database.hbRankDao()
}
}