package link.roadio.riff.ui import link.roadio.riff.player.core.selection.AiPteBand import link.roadio.riff.player.core.settings.PlayerDataLocation import link.roadio.riff.player.core.settings.PlayerDatabaseRebuild import link.roadio.riff.player.core.settings.PlayerSettings import link.roadio.riff.player.storage.PlaybackQueueSnapshot import link.roadio.riff.player.storage.StoredAiSelection import link.roadio.riff.player.storage.StoredAudiobookOverride import link.roadio.riff.player.storage.StoredContentMode import link.roadio.riff.player.storage.StoredPreference import link.roadio.riff.player.storage.StoredReaction import link.roadio.riff.storage.root.ApplicationDataLocation internal fun StoredAiSelection.toUi(): AiSelectionUiState = AiSelectionUiState( size = queueSize, pteBands = buildSet { if (pteBandsMask and 1 != 0) add(AiPteBand.SLOW) if (pteBandsMask and 2 != 0) add(AiPteBand.MEDIUM) if (pteBandsMask and 4 != 0 && size < 2) add(AiPteBand.FAST) }, arousal = arousal, valence = valence, ) internal fun AiSelectionUiState.toStored(): StoredAiSelection = StoredAiSelection( queueSize = size, pteBandsMask = pteBands.fold(0) { mask, band -> mask or when (band) { AiPteBand.SLOW -> 1 AiPteBand.MEDIUM -> 2 AiPteBand.FAST -> 4 } }, arousal = arousal, valence = valence, ) internal fun PlayerSettings.toUiState(profileId: Int): PlayerSettingsUiState = PlayerSettingsUiState( profileId = profileId, colorScheme = ColorScheme.valueOf(colorScheme.name), diagonal = DiagonalChoice.valueOf(diagonal.name), dataLocation = DataLocation.valueOf(dataLocation.name), longPressStartsPlayback = longPressStartsPlayback, autoSearch = autoSearch, ignoreLeadingArticles = ignoreLeadingArticles, dimBacklight = dimBacklight, replayGainMode = ReplayGainMode.valueOf(replayGainMode.name), replayGainTarget = ReplayGainTarget.valueOf(replayGainTarget.name), calibrationPpiX = calibrationPpiX, calibrationPpiY = calibrationPpiY, ) internal fun ApplicationDataLocation.toPlayer(): PlayerDataLocation = PlayerDataLocation.valueOf(name) internal fun DataLocation.toPlayer(): PlayerDataLocation = PlayerDataLocation.valueOf(name) internal fun PlayerDatabaseRebuild.toUi(): DatabaseRebuild = DatabaseRebuild.valueOf(name) internal fun Preference.toStored(): StoredPreference = StoredPreference.valueOf(name) internal fun StoredReaction.toUi(): ReactionState = ReactionState( preference = Preference.valueOf(preference.name), ownBanned = ownBanned, ) internal fun StoredContentMode.toUi(): ContentMode = ContentMode.valueOf(name) internal fun StoredAudiobookOverride.toUi(): AudiobookChoice = AudiobookChoice.valueOf(name) internal fun AudiobookChoice.toStored(): StoredAudiobookOverride? = when (this) { AudiobookChoice.BOOK -> StoredAudiobookOverride.BOOK AudiobookChoice.MUSIC -> StoredAudiobookOverride.MUSIC AudiobookChoice.AUTO -> null } internal fun Long?.toQueueIndex(queue: PlaybackQueueSnapshot?): Int = queue?.orderedOccurrences()?.indexOfFirst { it.occurrenceId == this } ?: -1 internal fun Throwable.asPlayerStateFailure(): String = "Player state update failed: ${message ?: javaClass.simpleName}"