package com.suno.android.common_data.user import arrow.core.getOrElse import com.suno.android.common_core_utils.SunoLogger import com.suno.android.common_networking.extensions.toThrowable import com.suno.android.common_networking.remote.session.SessionConfigService import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.update import javax.inject.Inject interface UserSessionRepository { fun sessionConfigurationStateFlow(): StateFlow fun refreshUserSessionConfigurationFlow(): Flow suspend fun refreshUserSessionConfiguration(): UserSessionConfiguration? fun clearMemorySession() } class UserSessionRepositoryImpl @Inject constructor( private val sessionConfigService: SessionConfigService, loggerFactory: SunoLogger.Factory, ) : UserSessionRepository { private val logger = loggerFactory.create(this@UserSessionRepositoryImpl) private val _sessionConfigurationStateFlow: MutableStateFlow = MutableStateFlow( UserSessionConfiguration( user = null, roles = null, statsigCustomProperties = null, ), ) override suspend fun refreshUserSessionConfiguration(): UserSessionConfiguration? { val response = sessionConfigService.getSunoSessionConfiguration().getOrElse { error -> logger.e(error.toThrowable()) return null } val configuration = UserSessionConfiguration( user = response.user, roles = response.roles, statsigCustomProperties = response.statsigCustomProperties?.let { UserSessionConfiguration.StatsigCustomProperties( custom = it.custom, customIds = it.customIds, ) }, ) logger.d { "Created configuration with user: ${response.user?.id}, " + "statsig custom properties: ${configuration.statsigCustomProperties}" } _sessionConfigurationStateFlow.update { configuration } return configuration } override fun refreshUserSessionConfigurationFlow(): Flow = flow { emit(refreshUserSessionConfiguration()) } override fun sessionConfigurationStateFlow(): StateFlow = _sessionConfigurationStateFlow.asStateFlow() override fun clearMemorySession() { _sessionConfigurationStateFlow.value = UserSessionConfiguration( user = null, roles = null, statsigCustomProperties = null, ) } }