package chats.data.repository import chats.data.remote.dto.* import chats.domain.model.* // Mappers fun ChatDto.toDomain(currentUserId: String, baseUrl: String): Chat { val chatName = name ?: if (type == "personal") { members.firstOrNull { it.userId != currentUserId }?.user?.displayName ?: "Unknown Chat" } else "Group Chat" val chatAvatar = (avatar ?: if (type == "personal") { members.firstOrNull { it.userId != currentUserId }?.user?.avatarUrl } else null)?.ensureAbsoluteUrl(baseUrl) return Chat( id = id, type = type, name = chatName, avatar = chatAvatar, unreadCount = unreadCount, lastMessage = messages.firstOrNull()?.toDomain(currentUserId, baseUrl) ) } fun MessageDto.toDomain(currentUserId: String, baseUrl: String): Message { val firstMedia = media.firstOrNull() val isVoiceFromFilename = firstMedia?.filename?.endsWith(".mp3", ignoreCase = true) == true || firstMedia?.filename?.startsWith("voice_", ignoreCase = true) == true val domainMediaType = when (type) { "gif" -> MediaType.GIF "image", "photo" -> MediaType.IMAGE "video" -> MediaType.VIDEO "audio", "voice" -> MediaType.AUDIO "file" -> if (isVoiceFromFilename) MediaType.AUDIO else MediaType.FILE else -> when (firstMedia?.type) { "image", "photo" -> MediaType.IMAGE "video" -> MediaType.VIDEO "audio", "voice" -> MediaType.AUDIO "file" -> if (isVoiceFromFilename) MediaType.AUDIO else MediaType.FILE else -> MediaType.TEXT } } return Message( id = id, chatId = chatId ?: "", senderId = senderId ?: "", senderName = sender?.displayName ?: "Unknown", senderAvatar = sender?.avatarUrl?.ensureAbsoluteUrl(baseUrl), content = content, sequenceId = sequenceId ?: 0, createdAt = createdAt ?: "", media = media.map { chats.domain.model.Media( id = it.id ?: java.util.UUID.randomUUID().toString(), type = if (isVoiceFromFilename) "voice" else (it.type ?: "unknown"), url = (it.url ?: "").ensureAbsoluteUrl(baseUrl), filename = it.filename, size = it.size, duration = it.duration ) }, mediaType = domainMediaType, reactions = reactions?.associate { it.emoji to it.count } ?: emptyMap(), isRead = senderId == currentUserId, isPinned = isPinned ?: false, isForwarded = forwardedFromId != null, forwardedFromName = forwardedFrom?.displayName ?: forwardedFrom?.username, replyTo = replyTo?.toDomain(currentUserId, baseUrl) ) } fun String.ensureAbsoluteUrl(baseUrl: String): String { return if (this.startsWith("http")) { this } else { val base = baseUrl.removeSuffix("/") val path = if (this.startsWith("/")) this else "/$this" "$base$path" } }