package com.suno.android.common_data.mappers.projects import com.suno.android.common_core_utils.Id import com.suno.android.common_core_utils.model.create.LocalProjectMetadata import com.suno.android.common_data.mappers.clips.xAsSongListDataOrNull import com.suno.android.common_networking.remote.entities.ProjectClipSchema import com.suno.android.common_networking.remote.entities.ProjectMetadataSchema import com.suno.android.common_networking.remote.entities.ProjectSchema import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId fun ProjectSchema.xAsProjectData(): ProjectData = ProjectData( id = Id(this.id), name = this.name, description = this.description, projectClips = this.projectClips.mapNotNull { it.xAsProjectClipData() }, pinnedClips = this.pinnedClips?.mapNotNull { it.xAsProjectClipData() }, isOwned = this.isOwned, isTrashed = this.isTrashed, clipCount = this.clipCount, currentPage = this.currentPage, imageUrl = this.imageUrl, createdAt = runCatching { LocalDateTime.ofInstant(Instant.parse(this.createdAt), ZoneId.systemDefault()) }.getOrNull(), ) fun ProjectClipSchema.xAsProjectClipData(): ProjectClip? = this.clip.xAsSongListDataOrNull()?.let { clip -> ProjectClip( clip = clip, relativeIndex = this.relativeIndex, pinned = this.pinned, ) } fun ProjectMetadataSchema.xAsProjectListItem(): ProjectListItem = ProjectListItem( id = Id(this.id), name = this.name, description = this.description, clipCount = this.clipCount.toInt(), lastUpdatedClipTime = runCatching { LocalDateTime.parse(this.lastUpdatedClip) }.getOrNull(), createdAt = runCatching { LocalDateTime.parse(this.createdAt) }.getOrNull(), ) fun ProjectMetadata.xAsLocalProjectMetadata(): LocalProjectMetadata = LocalProjectMetadata( id = id.map(), name = name, description = description, clipCount = clipCount, ) fun LocalProjectMetadata.xAsProjectListItem(): ProjectListItem = ProjectListItem( id = id.map(), name = name, description = description, clipCount = clipCount, lastUpdatedClipTime = null, createdAt = null, )