package com.suno.android.review import com.suno.android.common_core_utils.environment.UserPrefsDataStoreManager import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.firstOrNull import java.time.Instant import javax.inject.Inject import kotlin.time.Duration.Companion.days interface AppReviewManager { fun appReviewEventFlow(): Flow suspend fun onLike() suspend fun onCreate() suspend fun onShare() suspend fun onNotify() } class AppReviewManagerImpl @Inject constructor( private val userPrefsDataStoreManager: UserPrefsDataStoreManager, ) : AppReviewManager { private val _appReviewSharedFlow = MutableSharedFlow() private suspend fun canShowAppReviewPrompt(): Boolean { val lastPromptDate = userPrefsDataStoreManager.getLastAppReviewPromptTimeInMs().firstOrNull() ?: 0L return Instant.now().toEpochMilli() - lastPromptDate >= 30.days.inWholeMilliseconds } override fun appReviewEventFlow(): Flow = _appReviewSharedFlow.asSharedFlow() override suspend fun onLike() { val count = userPrefsDataStoreManager.incrementLikes() if (canShowAppReviewPrompt() && count >= 3) { _appReviewSharedFlow.emit("") } } override suspend fun onCreate() { val count = userPrefsDataStoreManager.incrementCreate() if (canShowAppReviewPrompt() && count >= 10) { _appReviewSharedFlow.emit("") } } override suspend fun onShare() { val count = userPrefsDataStoreManager.incrementShare() if (canShowAppReviewPrompt() && count >= 2) { _appReviewSharedFlow.emit("") } } override suspend fun onNotify() { userPrefsDataStoreManager.setLastAppReviewPromptTimeInMs(Instant.now().toEpochMilli()) } }