package com.suno.android.common_data.mappers.hooks import androidx.compose.runtime.Immutable import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.model.Url import com.suno.android.common_core_utils.model.UserHandle import com.suno.android.common_data.mappers.clips.LocalClipData import com.suno.android.common_data.metadata.Recommendation import com.suno.android.common_data.user.UserProfile import java.time.LocalDateTime import kotlin.time.Duration @Immutable data class LocalHookData( val hookId: Id, val title: String, val caption: String, val videoUrl: Url, val thumbnailImageUrl: Url?, val viewCount: Int, val likeCount: Int, val commentCount: Int, val currentUserLiked: Boolean, val currentUserFollowsCreator: Boolean, val creator: Creator, val createdAt: LocalDateTime?, val clip: LocalClipData, val recommendationItemId: Id?, val humanRating: HumanRating?, val lyricDisplayType: LyricDisplayType?, val clipTime: ClosedRange, val lyrics: Lyrics? = null, ) { data class Creator( val userId: Id, val handle: UserHandle?, val avatarUrl: Url?, val displayName: String?, ) enum class HumanRating { CHAMPION, PROMOTE, APPROVED, CONDITIONAL, SUPPRESS, ; companion object { fun fromString( value: String?, ): HumanRating? = when (value?.lowercase()) { "champion" -> CHAMPION "promote" -> PROMOTE "approved" -> APPROVED "conditional" -> CONDITIONAL "suppress" -> SUPPRESS else -> null } } } sealed interface LyricDisplayType { sealed interface Line : LyricDisplayType sealed interface Word : LyricDisplayType sealed interface BottomLeft : LyricDisplayType sealed interface Center : LyricDisplayType data object BottomLeftLine : LyricDisplayType, BottomLeft, Line data object BottomLeftWord : LyricDisplayType, BottomLeft, Word data object CenteredLine : LyricDisplayType, Center, Line data object CenteredWord : LyricDisplayType, Center, Word } }