package com.suno.android.common_data.upload.model import androidx.annotation.FloatRange import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.model.Url import com.suno.android.common_data.mappers.clips.SongListData sealed interface UploadingFile { sealed interface HasData { val name: String val thumbnail: Url? } sealed interface Working : HasData, UploadingFile sealed interface Incomplete : UploadingFile sealed interface HasProgress : UploadingFile { val progress: Float } data class Initializing( override val name: String, override val thumbnail: Url?, ) : UploadingFile, Working, Incomplete, HasProgress { override val progress: Float = 0f } sealed interface Initialized { val uploadId: Id } data class InProgress( override val uploadId: Id, override val name: String, override val thumbnail: Url?, val step: Step, @FloatRange(0.0, 1.0) val progressInStep: Float? = null, ) : UploadingFile, Initialized, Working, Incomplete, HasProgress { enum class Step { Initialize, Uploading, Finalize, } override val progress: Float get() { val progressToStep = step.ordinal.toFloat() / Step.entries.size return progressToStep + (progressInStep ?: 0f) } } sealed interface Complete : UploadingFile data class Success( override val uploadId: Id, override val name: String, override val thumbnail: Url?, val clipId: Id, ) : UploadingFile, Initialized, HasData, Complete data object NoFile : Complete data class Failure( val error: Throwable, ) : UploadingFile, Incomplete data object Cancelled : UploadingFile, Incomplete }