package com.suno.android.common_data.billing import androidx.annotation.VisibleForTesting import com.suno.android.common_core_utils.environment.UserPrefsDataStoreManager import com.suno.android.common_networking.remote.session.MaxLengths import com.suno.android.common_networking.remote.session.Model import com.suno.android.common_networking.remote.session.ModelFeatures import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import javax.inject.Inject interface SelectedModelProvider { fun getSelectedModelFlow(): Flow companion object { const val FALLBACK_MODEL_KEY: String = "chirp-auk-turbo" const val FALLBACK_MODEL_NAME: String = "v4.5-all" @VisibleForTesting val FALLBACK_DEFAULT_MODEL: Model = Model( canUse = true, capabilities = emptyList(), features = listOf(ModelFeatures.CreateControlSliders.value, ModelFeatures.TagUpsample.value), description = "Best free model", externalKey = FALLBACK_MODEL_KEY, id = "0f2d749c-2ecd-4c5c-9389-13468ce46e59", majorVersion = 5, maxLengths = MaxLengths( gptDescriptionPrompt = 500, negativeTags = 1000, prompt = 5000, tags = 1000, title = 100, ), name = FALLBACK_MODEL_NAME, isDefaultModel = true, badges = emptyList(), ) } } class SelectedModelProviderImpl @Inject constructor( private val billingRepo: SunoBillingRepo, private val userPrefsDataStoreManager: UserPrefsDataStoreManager, ) : SelectedModelProvider { override fun getSelectedModelFlow(): Flow = combine( billingRepo.billingStateFlow(), userPrefsDataStoreManager.getSelectedModel(), ::Pair, ).map { (billingInfo, selectedModelName) -> val availableModels = billingInfo?.models ?: emptyList() availableModels.find { it.name == selectedModelName && !it.externalKey.isNullOrBlank() } ?: SelectedModelProvider.FALLBACK_DEFAULT_MODEL } }