package com.pixelized.desktop.lwa import com.pixelized.desktop.lwa.network.LwaClient import com.pixelized.desktop.lwa.network.LwaClientImpl import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository import com.pixelized.desktop.lwa.repository.alteration.AlterationStore import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository import com.pixelized.desktop.lwa.repository.campaign.CampaignStore import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetStore import com.pixelized.desktop.lwa.repository.network.NetworkRepository import com.pixelized.desktop.lwa.repository.roll_history.RollHistoryRepository import com.pixelized.desktop.lwa.repository.settings.SettingsFactory import com.pixelized.desktop.lwa.repository.settings.SettingsRepository import com.pixelized.desktop.lwa.repository.settings.SettingsStore import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogFactory import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.CharacterRibbonFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDiminishedViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.npc.NpcRibbonViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbonViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.text.TextMessageFactory import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbarViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetFactory import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditFactory import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.common.SkillFieldFactory import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterActionUseCase import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterFactory import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterViewModel import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpFactory import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpViewModel import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryViewModel import com.pixelized.desktop.lwa.ui.screen.settings.SettingsViewModel import com.pixelized.desktop.lwa.usecase.SettingsUseCase import com.pixelized.shared.lwa.model.campaign.factory.CampaignJsonFactory import com.pixelized.shared.lwa.utils.PathProvider import io.ktor.client.HttpClient import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.client.plugins.websocket.WebSockets import io.ktor.serialization.kotlinx.json.json import org.koin.core.module.dsl.factoryOf import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module val appModuleDependencies get() = listOf( factoryDependencies, useCaseDependencies, storeDependencies, repositoryDependencies, viewModelDependencies, toolsDependencies, ) val toolsDependencies get() = module { single { HttpClient( engine = OkHttp.create(), ) { install(WebSockets) { pingIntervalMillis = 20_000 } install(ContentNegotiation) { json(get()) } } } single { val client: HttpClient = get() val setting: SettingsRepository = get() LwaClientImpl(client, setting) } single { PathProvider(appName = "LwaClient") } } val storeDependencies get() = module { singleOf(::CharacterSheetStore) singleOf(::SettingsStore) singleOf(::AlterationStore) singleOf(::CampaignStore) } val repositoryDependencies get() = module { singleOf(::NetworkRepository) singleOf(::CharacterSheetRepository) singleOf(::RollHistoryRepository) singleOf(::SettingsRepository) singleOf(::AlterationRepository) singleOf(::CampaignRepository) } val factoryDependencies get() = module { factoryOf(::CharacterSheetFactory) factoryOf(::CharacterSheetEditFactory) factoryOf(::NetworkFactory) factoryOf(::SkillFieldFactory) factoryOf(::SettingsFactory) factoryOf(::CampaignJsonFactory) factoryOf(::CharacterRibbonFactory) factoryOf(::CharacterDetailFactory) factoryOf(::CharacterSheetCharacteristicDialogFactory) factoryOf(::TextMessageFactory) factoryOf(::LevelUpFactory) factoryOf(::GameMasterFactory) } val viewModelDependencies get() = module { viewModelOf(::DataSyncViewModel) viewModelOf(::CampaignToolbarViewModel) viewModelOf(::CharacterSheetViewModel) viewModelOf(::CharacterSheetEditViewModel) viewModelOf(::RollViewModel) viewModelOf(::RollHistoryViewModel) viewModelOf(::NetworkViewModel) viewModelOf(::PlayerRibbonViewModel) viewModelOf(::NpcRibbonViewModel) viewModelOf(::CharacterDetailViewModel) viewModelOf(::CharacterDiminishedViewModel) viewModelOf(::CharacterDetailCharacteristicDialogViewModel) viewModelOf(::CampaignChatViewModel) viewModelOf(::SettingsViewModel) viewModelOf(::LevelUpViewModel) viewModelOf(::GameMasterViewModel) } val useCaseDependencies get() = module { factoryOf(::SettingsUseCase) factoryOf(::GameMasterActionUseCase) }