package dev.inmo.tgbotapi.types.message.content import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.ChatIdentifier import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.TelegramMediaFile import dev.inmo.tgbotapi.types.media.TelegramMedia import dev.inmo.tgbotapi.types.message.abstracts.* import dev.inmo.tgbotapi.utils.RiskFeature import kotlinx.serialization.modules.* sealed interface MessageContent: ResendableContent { companion object { @RiskFeature("This serialization module can be changed in near releases") fun serializationModule( visualMediaGroupContentAdditionalBuilder: PolymorphicModuleBuilder.() -> Unit = {}, documentMediaGroupContentAdditionalBuilder: PolymorphicModuleBuilder.() -> Unit = {}, audioMediaGroupContentAdditionalBuilder: PolymorphicModuleBuilder.() -> Unit = {}, mediaGroupContentAdditionalBuilder: PolymorphicModuleBuilder.() -> Unit = {}, textedMediaContentAdditionalBuilder: PolymorphicModuleBuilder.() -> Unit = {}, mediaContentAdditionalBuilder: PolymorphicModuleBuilder.() -> Unit = {}, mediaCollectionContentAdditionalBuilder: PolymorphicModuleBuilder>.() -> Unit = {}, additionalBuilder: PolymorphicModuleBuilder.() -> Unit = {} ) = SerializersModule { polymorphic(MessageContent::class) { subclass(ContactContent::class) subclass(VenueContent::class) subclass(PollContent::class) subclass(DiceContent::class) subclass(TextContent::class) subclass(LocationContent::class, LocationContentSerializer) subclass(PhotoContent::class) subclass(VideoContent::class) subclass(AudioContent::class) subclass(DocumentContent::class) subclass(VoiceContent::class) subclass(VideoNoteContent::class) subclass(AnimationContent::class) subclass(StickerContent::class) subclass(InvoiceContent::class) additionalBuilder() } polymorphic(MediaCollectionContent::class) { subclass(PhotoContent::class) mediaCollectionContentAdditionalBuilder() } polymorphic(MediaContent::class) { subclass(VideoNoteContent::class) subclass(VideoContent::class) subclass(StickerContent::class) subclass(PhotoContent::class) subclass(VoiceContent::class) subclass(AnimationContent::class) subclass(AudioContent::class) subclass(DocumentContent::class) mediaContentAdditionalBuilder() } polymorphic(TextedMediaContent::class) { subclass(PhotoContent::class) subclass(VoiceContent::class) subclass(AnimationContent::class) subclass(AudioContent::class) subclass(DocumentContent::class) textedMediaContentAdditionalBuilder() } polymorphic(MediaGroupContent::class) { subclass(PhotoContent::class) subclass(AudioContent::class) subclass(DocumentContent::class) mediaGroupContentAdditionalBuilder() } polymorphic(AudioMediaGroupContent::class) { subclass(AudioContent::class) audioMediaGroupContentAdditionalBuilder() } polymorphic(DocumentMediaGroupContent::class) { subclass(DocumentContent::class) documentMediaGroupContentAdditionalBuilder() } polymorphic(VisualMediaGroupContent::class) { subclass(PhotoContent::class) subclass(VideoContent::class) visualMediaGroupContentAdditionalBuilder() } } } } sealed interface MediaCollectionContent: MessageContent, MediaContent { val mediaCollection: List } sealed interface MediaContent: MessageContent { val media: TelegramMediaFile fun asTelegramMedia(): TelegramMedia } @ClassCastsIncluded sealed interface ResendableContent { fun createResend( chatId: ChatIdentifier, disableNotification: Boolean = false, protectContent: Boolean = false, replyToMessageId: MessageIdentifier? = null, allowSendingWithoutReply: Boolean? = null, replyMarkup: KeyboardMarkup? = null ): Request }