package com.suno.android.clip import arrow.core.Either import arrow.retrofit.adapter.either.networkhandling.CallError import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.SunoLogger import com.suno.android.common_data.mappers.clips.SongListData import com.suno.android.common_networking.extensions.toThrowable import com.suno.android.common_networking.remote.clips.ClipsService import com.suno.android.common_networking.remote.entities.RemoteToggleRemixBody import com.suno.android.media.MediaMetadataManager import com.suno.android.media.MediaRemixability import javax.inject.Inject /** * Use-case for updating clip remixability (Allow remix). */ class UpdateClipRemixabilityUseCase @Inject constructor( loggerFactory: SunoLogger.Factory, private val clipsService: ClipsService, private val mediaMetadataManager: MediaMetadataManager, ) { private val logger = loggerFactory.create(this@UpdateClipRemixabilityUseCase) suspend operator fun invoke( clipId: Id, requestedAllowStatus: Boolean, ): Either { val body = RemoteToggleRemixBody(canRemix = requestedAllowStatus) val result = clipsService.toggleRemixes(clipId = clipId.value, body = body) return result.map { remoteClipRemixability -> val remixability = MediaRemixability(clipId, remoteClipRemixability.canRemix) broadcastReaction(clipId, remixability) remixability }.mapLeft { error -> logger.e(error.toThrowable()) { "Failed to update remixability" } error } } private suspend fun broadcastReaction( clipId: Id, remixability: MediaRemixability?, ) { val mediaRemixability = MediaRemixability(clipId, remixability?.canRemix == true) mediaMetadataManager.broadcastMediaRemixability(mediaRemixability) } }