package com.suno.android.common_data.mappers.clips import androidx.compose.runtime.Immutable import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.constants.ReactionType import com.suno.android.common_core_utils.constants.SunoMediaType import com.suno.android.common_core_utils.model.Url import com.suno.android.common_core_utils.model.UserHandle import com.suno.android.common_data.badge.ModelBadgeData import com.suno.android.common_data.user.UserProfile import com.suno.android.common_db.database.entities.CaptionMentionsEntity import kotlin.time.Duration @Immutable data class LocalClipData( val clipId: Id, val mediaType: SunoMediaType, val mediaUrl: Url, val artistName: String?, val artistUserId: Id?, val handle: UserHandle?, val artistAvatarUrl: Url?, val nowPlayingTitle: String?, val albumImageUrl: Url?, val videoCoverUrl: Url?, val previewUrl: Url?, val lyricsString: String? = null, val caption: String? = null, val captionMentions: CaptionMentionsEntity? = null, val isPublic: Boolean = false, val modelName: String?, val majorModelVersion: String?, val reaction: ReactionType? = null, val prompt: String?, val gptPrompt: String?, val tags: String?, val displayTags: String?, val status: ClipStatus, val downloadDisabledReason: String?, val commentCount: Int?, val upvoteCount: Int?, val duration: Duration? = null, val playCount: Int? = null, val isFollowing: Boolean? = null, val allowComments: Boolean? = null, val canRemix: Boolean? = null, val isRemix: Boolean? = null, val remixTask: String? = null, val optOutVideoCoverHook: Boolean? = null, val modelBadge: ModelBadgeData? = null, val type: String? = null, ) { /** * Returns lyrics for display, falling back to prompt if lyricsString is null. * This ensures edited lyrics (stored in prompt) are shown before fetching from aligned lyrics API. */ val displayLyrics: String? get() = lyricsString ?: prompt }