// Code generated by gotdgen, DO NOT EDIT.

package tg

import (
	"context"
	"errors"
	"fmt"
	"sort"
	"strings"

	"go.uber.org/multierr"

	"go.mau.fi/mautrix-telegram/pkg/gotd/bin"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdjson"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdp"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tgerr"
)

// No-op definition for keeping imports.
var (
	_ = bin.Buffer{}
	_ = context.Background()
	_ = fmt.Stringer(nil)
	_ = strings.Builder{}
	_ = errors.Is
	_ = multierr.AppendInto
	_ = sort.Ints
	_ = tdp.Format
	_ = tgerr.Error{}
	_ = tdjson.Encoder{}
)

// MessagesSendMediaRequest represents TL type `messages.sendMedia#330e77f`.
// Send a media
//
// See https://core.telegram.org/method/messages.sendMedia for reference.
type MessagesSendMediaRequest struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// Send message silently (no notification should be triggered)
	Silent bool
	// Send message in background
	Background bool
	// Clear the draft
	ClearDraft bool
	// Only for bots, disallows forwarding and saving of the messages, even if the
	// destination chat doesn't have content protection¹ enabled
	//
	// Links:
	//  1) https://telegram.org/blog/protected-content-delete-by-date-and-more
	Noforwards bool
	// Whether to move used stickersets to top, see here for more info on this flag »¹
	//
	// Links:
	//  1) https://core.telegram.org/api/stickers#recent-stickersets
	UpdateStickersetsOrder bool
	// If set, any eventual webpage preview will be shown on top of the message instead of at
	// the bottom.
	InvertMedia bool
	// Bots only: if set, allows sending up to 1000 messages per second, ignoring
	// broadcasting limits¹ for a fee of 0.1 Telegram Stars per message. The relevant Stars
	// will be withdrawn from the bot's balance.
	//
	// Links:
	//  1) https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once
	AllowPaidFloodskip bool
	// Destination
	Peer InputPeerClass
	// If set, indicates that the message should be sent in reply to the specified message or
	// story.
	//
	// Use SetReplyTo and GetReplyTo helpers.
	ReplyTo InputReplyToClass
	// Attached media
	Media InputMediaClass
	// Caption
	Message string
	// Random ID to avoid resending the same message
	RandomID int64
	// Reply markup for bot keyboards
	//
	// Use SetReplyMarkup and GetReplyMarkup helpers.
	ReplyMarkup ReplyMarkupClass
	// Message entities¹ for styled text
	//
	// Links:
	//  1) https://core.telegram.org/api/entities
	//
	// Use SetEntities and GetEntities helpers.
	Entities []MessageEntityClass
	// Scheduled message date for scheduled messages¹
	//
	// Links:
	//  1) https://core.telegram.org/api/scheduled-messages
	//
	// Use SetScheduleDate and GetScheduleDate helpers.
	ScheduleDate int
	// ScheduleRepeatPeriod field of MessagesSendMediaRequest.
	//
	// Use SetScheduleRepeatPeriod and GetScheduleRepeatPeriod helpers.
	ScheduleRepeatPeriod int
	// Send this message as the specified peer
	//
	// Use SetSendAs and GetSendAs helpers.
	SendAs InputPeerClass
	// Add the message to the specified quick reply shortcut »¹, instead.
	//
	// Links:
	//  1) https://core.telegram.org/api/business#quick-reply-shortcuts
	//
	// Use SetQuickReplyShortcut and GetQuickReplyShortcut helpers.
	QuickReplyShortcut InputQuickReplyShortcutClass
	// Specifies a message effect »¹ to use for the message.
	//
	// Links:
	//  1) https://core.telegram.org/api/effects
	//
	// Use SetEffect and GetEffect helpers.
	Effect int64
	// For paid messages »¹, specifies the amount of Telegram Stars² the user has agreed
	// to pay in order to send the message.
	//
	// Links:
	//  1) https://core.telegram.org/api/paid-messages
	//  2) https://core.telegram.org/api/stars
	//
	// Use SetAllowPaidStars and GetAllowPaidStars helpers.
	AllowPaidStars int64
	// Used to suggest a post to a channel, see here »¹ for more info on the full flow.
	//
	// Links:
	//  1) https://core.telegram.org/api/suggested-posts
	//
	// Use SetSuggestedPost and GetSuggestedPost helpers.
	SuggestedPost SuggestedPost
}

// MessagesSendMediaRequestTypeID is TL type id of MessagesSendMediaRequest.
const MessagesSendMediaRequestTypeID = 0x330e77f

// Ensuring interfaces in compile-time for MessagesSendMediaRequest.
var (
	_ bin.Encoder     = &MessagesSendMediaRequest{}
	_ bin.Decoder     = &MessagesSendMediaRequest{}
	_ bin.BareEncoder = &MessagesSendMediaRequest{}
	_ bin.BareDecoder = &MessagesSendMediaRequest{}
)

func (s *MessagesSendMediaRequest) Zero() bool {
	if s == nil {
		return true
	}
	if !(s.Flags.Zero()) {
		return false
	}
	if !(s.Silent == false) {
		return false
	}
	if !(s.Background == false) {
		return false
	}
	if !(s.ClearDraft == false) {
		return false
	}
	if !(s.Noforwards == false) {
		return false
	}
	if !(s.UpdateStickersetsOrder == false) {
		return false
	}
	if !(s.InvertMedia == false) {
		return false
	}
	if !(s.AllowPaidFloodskip == false) {
		return false
	}
	if !(s.Peer == nil) {
		return false
	}
	if !(s.ReplyTo == nil) {
		return false
	}
	if !(s.Media == nil) {
		return false
	}
	if !(s.Message == "") {
		return false
	}
	if !(s.RandomID == 0) {
		return false
	}
	if !(s.ReplyMarkup == nil) {
		return false
	}
	if !(s.Entities == nil) {
		return false
	}
	if !(s.ScheduleDate == 0) {
		return false
	}
	if !(s.ScheduleRepeatPeriod == 0) {
		return false
	}
	if !(s.SendAs == nil) {
		return false
	}
	if !(s.QuickReplyShortcut == nil) {
		return false
	}
	if !(s.Effect == 0) {
		return false
	}
	if !(s.AllowPaidStars == 0) {
		return false
	}
	if !(s.SuggestedPost.Zero()) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (s *MessagesSendMediaRequest) String() string {
	if s == nil {
		return "MessagesSendMediaRequest(nil)"
	}
	type Alias MessagesSendMediaRequest
	return fmt.Sprintf("MessagesSendMediaRequest%+v", Alias(*s))
}

// FillFrom fills MessagesSendMediaRequest from given interface.
func (s *MessagesSendMediaRequest) FillFrom(from interface {
	GetSilent() (value bool)
	GetBackground() (value bool)
	GetClearDraft() (value bool)
	GetNoforwards() (value bool)
	GetUpdateStickersetsOrder() (value bool)
	GetInvertMedia() (value bool)
	GetAllowPaidFloodskip() (value bool)
	GetPeer() (value InputPeerClass)
	GetReplyTo() (value InputReplyToClass, ok bool)
	GetMedia() (value InputMediaClass)
	GetMessage() (value string)
	GetRandomID() (value int64)
	GetReplyMarkup() (value ReplyMarkupClass, ok bool)
	GetEntities() (value []MessageEntityClass, ok bool)
	GetScheduleDate() (value int, ok bool)
	GetScheduleRepeatPeriod() (value int, ok bool)
	GetSendAs() (value InputPeerClass, ok bool)
	GetQuickReplyShortcut() (value InputQuickReplyShortcutClass, ok bool)
	GetEffect() (value int64, ok bool)
	GetAllowPaidStars() (value int64, ok bool)
	GetSuggestedPost() (value SuggestedPost, ok bool)
}) {
	s.Silent = from.GetSilent()
	s.Background = from.GetBackground()
	s.ClearDraft = from.GetClearDraft()
	s.Noforwards = from.GetNoforwards()
	s.UpdateStickersetsOrder = from.GetUpdateStickersetsOrder()
	s.InvertMedia = from.GetInvertMedia()
	s.AllowPaidFloodskip = from.GetAllowPaidFloodskip()
	s.Peer = from.GetPeer()
	if val, ok := from.GetReplyTo(); ok {
		s.ReplyTo = val
	}

	s.Media = from.GetMedia()
	s.Message = from.GetMessage()
	s.RandomID = from.GetRandomID()
	if val, ok := from.GetReplyMarkup(); ok {
		s.ReplyMarkup = val
	}

	if val, ok := from.GetEntities(); ok {
		s.Entities = val
	}

	if val, ok := from.GetScheduleDate(); ok {
		s.ScheduleDate = val
	}

	if val, ok := from.GetScheduleRepeatPeriod(); ok {
		s.ScheduleRepeatPeriod = val
	}

	if val, ok := from.GetSendAs(); ok {
		s.SendAs = val
	}

	if val, ok := from.GetQuickReplyShortcut(); ok {
		s.QuickReplyShortcut = val
	}

	if val, ok := from.GetEffect(); ok {
		s.Effect = val
	}

	if val, ok := from.GetAllowPaidStars(); ok {
		s.AllowPaidStars = val
	}

	if val, ok := from.GetSuggestedPost(); ok {
		s.SuggestedPost = val
	}

}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*MessagesSendMediaRequest) TypeID() uint32 {
	return MessagesSendMediaRequestTypeID
}

// TypeName returns name of type in TL schema.
func (*MessagesSendMediaRequest) TypeName() string {
	return "messages.sendMedia"
}

// TypeInfo returns info about TL type.
func (s *MessagesSendMediaRequest) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "messages.sendMedia",
		ID:   MessagesSendMediaRequestTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Silent",
			SchemaName: "silent",
			Null:       !s.Flags.Has(5),
		},
		{
			Name:       "Background",
			SchemaName: "background",
			Null:       !s.Flags.Has(6),
		},
		{
			Name:       "ClearDraft",
			SchemaName: "clear_draft",
			Null:       !s.Flags.Has(7),
		},
		{
			Name:       "Noforwards",
			SchemaName: "noforwards",
			Null:       !s.Flags.Has(14),
		},
		{
			Name:       "UpdateStickersetsOrder",
			SchemaName: "update_stickersets_order",
			Null:       !s.Flags.Has(15),
		},
		{
			Name:       "InvertMedia",
			SchemaName: "invert_media",
			Null:       !s.Flags.Has(16),
		},
		{
			Name:       "AllowPaidFloodskip",
			SchemaName: "allow_paid_floodskip",
			Null:       !s.Flags.Has(19),
		},
		{
			Name:       "Peer",
			SchemaName: "peer",
		},
		{
			Name:       "ReplyTo",
			SchemaName: "reply_to",
			Null:       !s.Flags.Has(0),
		},
		{
			Name:       "Media",
			SchemaName: "media",
		},
		{
			Name:       "Message",
			SchemaName: "message",
		},
		{
			Name:       "RandomID",
			SchemaName: "random_id",
		},
		{
			Name:       "ReplyMarkup",
			SchemaName: "reply_markup",
			Null:       !s.Flags.Has(2),
		},
		{
			Name:       "Entities",
			SchemaName: "entities",
			Null:       !s.Flags.Has(3),
		},
		{
			Name:       "ScheduleDate",
			SchemaName: "schedule_date",
			Null:       !s.Flags.Has(10),
		},
		{
			Name:       "ScheduleRepeatPeriod",
			SchemaName: "schedule_repeat_period",
			Null:       !s.Flags.Has(24),
		},
		{
			Name:       "SendAs",
			SchemaName: "send_as",
			Null:       !s.Flags.Has(13),
		},
		{
			Name:       "QuickReplyShortcut",
			SchemaName: "quick_reply_shortcut",
			Null:       !s.Flags.Has(17),
		},
		{
			Name:       "Effect",
			SchemaName: "effect",
			Null:       !s.Flags.Has(18),
		},
		{
			Name:       "AllowPaidStars",
			SchemaName: "allow_paid_stars",
			Null:       !s.Flags.Has(21),
		},
		{
			Name:       "SuggestedPost",
			SchemaName: "suggested_post",
			Null:       !s.Flags.Has(22),
		},
	}
	return typ
}

// SetFlags sets flags for non-zero fields.
func (s *MessagesSendMediaRequest) SetFlags() {
	if !(s.Silent == false) {
		s.Flags.Set(5)
	}
	if !(s.Background == false) {
		s.Flags.Set(6)
	}
	if !(s.ClearDraft == false) {
		s.Flags.Set(7)
	}
	if !(s.Noforwards == false) {
		s.Flags.Set(14)
	}
	if !(s.UpdateStickersetsOrder == false) {
		s.Flags.Set(15)
	}
	if !(s.InvertMedia == false) {
		s.Flags.Set(16)
	}
	if !(s.AllowPaidFloodskip == false) {
		s.Flags.Set(19)
	}
	if !(s.ReplyTo == nil) {
		s.Flags.Set(0)
	}
	if !(s.ReplyMarkup == nil) {
		s.Flags.Set(2)
	}
	if !(s.Entities == nil) {
		s.Flags.Set(3)
	}
	if !(s.ScheduleDate == 0) {
		s.Flags.Set(10)
	}
	if !(s.ScheduleRepeatPeriod == 0) {
		s.Flags.Set(24)
	}
	if !(s.SendAs == nil) {
		s.Flags.Set(13)
	}
	if !(s.QuickReplyShortcut == nil) {
		s.Flags.Set(17)
	}
	if !(s.Effect == 0) {
		s.Flags.Set(18)
	}
	if !(s.AllowPaidStars == 0) {
		s.Flags.Set(21)
	}
	if !(s.SuggestedPost.Zero()) {
		s.Flags.Set(22)
	}
}

// Encode implements bin.Encoder.
func (s *MessagesSendMediaRequest) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode messages.sendMedia#330e77f as nil")
	}
	b.PutID(MessagesSendMediaRequestTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *MessagesSendMediaRequest) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode messages.sendMedia#330e77f as nil")
	}
	s.SetFlags()
	if err := s.Flags.Encode(b); err != nil {
		return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field flags: %w", err)
	}
	if s.Peer == nil {
		return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field peer is nil")
	}
	if err := s.Peer.Encode(b); err != nil {
		return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field peer: %w", err)
	}
	if s.Flags.Has(0) {
		if s.ReplyTo == nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field reply_to is nil")
		}
		if err := s.ReplyTo.Encode(b); err != nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field reply_to: %w", err)
		}
	}
	if s.Media == nil {
		return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field media is nil")
	}
	if err := s.Media.Encode(b); err != nil {
		return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field media: %w", err)
	}
	b.PutString(s.Message)
	b.PutLong(s.RandomID)
	if s.Flags.Has(2) {
		if s.ReplyMarkup == nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field reply_markup is nil")
		}
		if err := s.ReplyMarkup.Encode(b); err != nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field reply_markup: %w", err)
		}
	}
	if s.Flags.Has(3) {
		b.PutVectorHeader(len(s.Entities))
		for idx, v := range s.Entities {
			if v == nil {
				return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field entities element with index %d is nil", idx)
			}
			if err := v.Encode(b); err != nil {
				return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field entities element with index %d: %w", idx, err)
			}
		}
	}
	if s.Flags.Has(10) {
		b.PutInt(s.ScheduleDate)
	}
	if s.Flags.Has(24) {
		b.PutInt(s.ScheduleRepeatPeriod)
	}
	if s.Flags.Has(13) {
		if s.SendAs == nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field send_as is nil")
		}
		if err := s.SendAs.Encode(b); err != nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field send_as: %w", err)
		}
	}
	if s.Flags.Has(17) {
		if s.QuickReplyShortcut == nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field quick_reply_shortcut is nil")
		}
		if err := s.QuickReplyShortcut.Encode(b); err != nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field quick_reply_shortcut: %w", err)
		}
	}
	if s.Flags.Has(18) {
		b.PutLong(s.Effect)
	}
	if s.Flags.Has(21) {
		b.PutLong(s.AllowPaidStars)
	}
	if s.Flags.Has(22) {
		if err := s.SuggestedPost.Encode(b); err != nil {
			return fmt.Errorf("unable to encode messages.sendMedia#330e77f: field suggested_post: %w", err)
		}
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *MessagesSendMediaRequest) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode messages.sendMedia#330e77f to nil")
	}
	if err := b.ConsumeID(MessagesSendMediaRequestTypeID); err != nil {
		return fmt.Errorf("unable to decode messages.sendMedia#330e77f: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *MessagesSendMediaRequest) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode messages.sendMedia#330e77f to nil")
	}
	{
		if err := s.Flags.Decode(b); err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field flags: %w", err)
		}
	}
	s.Silent = s.Flags.Has(5)
	s.Background = s.Flags.Has(6)
	s.ClearDraft = s.Flags.Has(7)
	s.Noforwards = s.Flags.Has(14)
	s.UpdateStickersetsOrder = s.Flags.Has(15)
	s.InvertMedia = s.Flags.Has(16)
	s.AllowPaidFloodskip = s.Flags.Has(19)
	{
		value, err := DecodeInputPeer(b)
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field peer: %w", err)
		}
		s.Peer = value
	}
	if s.Flags.Has(0) {
		value, err := DecodeInputReplyTo(b)
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field reply_to: %w", err)
		}
		s.ReplyTo = value
	}
	{
		value, err := DecodeInputMedia(b)
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field media: %w", err)
		}
		s.Media = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field message: %w", err)
		}
		s.Message = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field random_id: %w", err)
		}
		s.RandomID = value
	}
	if s.Flags.Has(2) {
		value, err := DecodeReplyMarkup(b)
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field reply_markup: %w", err)
		}
		s.ReplyMarkup = value
	}
	if s.Flags.Has(3) {
		headerLen, err := b.VectorHeader()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field entities: %w", err)
		}

		if headerLen > 0 {
			s.Entities = make([]MessageEntityClass, 0, headerLen%bin.PreallocateLimit)
		}
		for idx := 0; idx < headerLen; idx++ {
			value, err := DecodeMessageEntity(b)
			if err != nil {
				return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field entities: %w", err)
			}
			s.Entities = append(s.Entities, value)
		}
	}
	if s.Flags.Has(10) {
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field schedule_date: %w", err)
		}
		s.ScheduleDate = value
	}
	if s.Flags.Has(24) {
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field schedule_repeat_period: %w", err)
		}
		s.ScheduleRepeatPeriod = value
	}
	if s.Flags.Has(13) {
		value, err := DecodeInputPeer(b)
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field send_as: %w", err)
		}
		s.SendAs = value
	}
	if s.Flags.Has(17) {
		value, err := DecodeInputQuickReplyShortcut(b)
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field quick_reply_shortcut: %w", err)
		}
		s.QuickReplyShortcut = value
	}
	if s.Flags.Has(18) {
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field effect: %w", err)
		}
		s.Effect = value
	}
	if s.Flags.Has(21) {
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field allow_paid_stars: %w", err)
		}
		s.AllowPaidStars = value
	}
	if s.Flags.Has(22) {
		if err := s.SuggestedPost.Decode(b); err != nil {
			return fmt.Errorf("unable to decode messages.sendMedia#330e77f: field suggested_post: %w", err)
		}
	}
	return nil
}

// SetSilent sets value of Silent conditional field.
func (s *MessagesSendMediaRequest) SetSilent(value bool) {
	if value {
		s.Flags.Set(5)
		s.Silent = true
	} else {
		s.Flags.Unset(5)
		s.Silent = false
	}
}

// GetSilent returns value of Silent conditional field.
func (s *MessagesSendMediaRequest) GetSilent() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(5)
}

// SetBackground sets value of Background conditional field.
func (s *MessagesSendMediaRequest) SetBackground(value bool) {
	if value {
		s.Flags.Set(6)
		s.Background = true
	} else {
		s.Flags.Unset(6)
		s.Background = false
	}
}

// GetBackground returns value of Background conditional field.
func (s *MessagesSendMediaRequest) GetBackground() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(6)
}

// SetClearDraft sets value of ClearDraft conditional field.
func (s *MessagesSendMediaRequest) SetClearDraft(value bool) {
	if value {
		s.Flags.Set(7)
		s.ClearDraft = true
	} else {
		s.Flags.Unset(7)
		s.ClearDraft = false
	}
}

// GetClearDraft returns value of ClearDraft conditional field.
func (s *MessagesSendMediaRequest) GetClearDraft() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(7)
}

// SetNoforwards sets value of Noforwards conditional field.
func (s *MessagesSendMediaRequest) SetNoforwards(value bool) {
	if value {
		s.Flags.Set(14)
		s.Noforwards = true
	} else {
		s.Flags.Unset(14)
		s.Noforwards = false
	}
}

// GetNoforwards returns value of Noforwards conditional field.
func (s *MessagesSendMediaRequest) GetNoforwards() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(14)
}

// SetUpdateStickersetsOrder sets value of UpdateStickersetsOrder conditional field.
func (s *MessagesSendMediaRequest) SetUpdateStickersetsOrder(value bool) {
	if value {
		s.Flags.Set(15)
		s.UpdateStickersetsOrder = true
	} else {
		s.Flags.Unset(15)
		s.UpdateStickersetsOrder = false
	}
}

// GetUpdateStickersetsOrder returns value of UpdateStickersetsOrder conditional field.
func (s *MessagesSendMediaRequest) GetUpdateStickersetsOrder() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(15)
}

// SetInvertMedia sets value of InvertMedia conditional field.
func (s *MessagesSendMediaRequest) SetInvertMedia(value bool) {
	if value {
		s.Flags.Set(16)
		s.InvertMedia = true
	} else {
		s.Flags.Unset(16)
		s.InvertMedia = false
	}
}

// GetInvertMedia returns value of InvertMedia conditional field.
func (s *MessagesSendMediaRequest) GetInvertMedia() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(16)
}

// SetAllowPaidFloodskip sets value of AllowPaidFloodskip conditional field.
func (s *MessagesSendMediaRequest) SetAllowPaidFloodskip(value bool) {
	if value {
		s.Flags.Set(19)
		s.AllowPaidFloodskip = true
	} else {
		s.Flags.Unset(19)
		s.AllowPaidFloodskip = false
	}
}

// GetAllowPaidFloodskip returns value of AllowPaidFloodskip conditional field.
func (s *MessagesSendMediaRequest) GetAllowPaidFloodskip() (value bool) {
	if s == nil {
		return
	}
	return s.Flags.Has(19)
}

// GetPeer returns value of Peer field.
func (s *MessagesSendMediaRequest) GetPeer() (value InputPeerClass) {
	if s == nil {
		return
	}
	return s.Peer
}

// SetReplyTo sets value of ReplyTo conditional field.
func (s *MessagesSendMediaRequest) SetReplyTo(value InputReplyToClass) {
	s.Flags.Set(0)
	s.ReplyTo = value
}

// GetReplyTo returns value of ReplyTo conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetReplyTo() (value InputReplyToClass, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(0) {
		return value, false
	}
	return s.ReplyTo, true
}

// GetMedia returns value of Media field.
func (s *MessagesSendMediaRequest) GetMedia() (value InputMediaClass) {
	if s == nil {
		return
	}
	return s.Media
}

// GetMessage returns value of Message field.
func (s *MessagesSendMediaRequest) GetMessage() (value string) {
	if s == nil {
		return
	}
	return s.Message
}

// GetRandomID returns value of RandomID field.
func (s *MessagesSendMediaRequest) GetRandomID() (value int64) {
	if s == nil {
		return
	}
	return s.RandomID
}

// SetReplyMarkup sets value of ReplyMarkup conditional field.
func (s *MessagesSendMediaRequest) SetReplyMarkup(value ReplyMarkupClass) {
	s.Flags.Set(2)
	s.ReplyMarkup = value
}

// GetReplyMarkup returns value of ReplyMarkup conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetReplyMarkup() (value ReplyMarkupClass, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(2) {
		return value, false
	}
	return s.ReplyMarkup, true
}

// SetEntities sets value of Entities conditional field.
func (s *MessagesSendMediaRequest) SetEntities(value []MessageEntityClass) {
	s.Flags.Set(3)
	s.Entities = value
}

// GetEntities returns value of Entities conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetEntities() (value []MessageEntityClass, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(3) {
		return value, false
	}
	return s.Entities, true
}

// SetScheduleDate sets value of ScheduleDate conditional field.
func (s *MessagesSendMediaRequest) SetScheduleDate(value int) {
	s.Flags.Set(10)
	s.ScheduleDate = value
}

// GetScheduleDate returns value of ScheduleDate conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetScheduleDate() (value int, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(10) {
		return value, false
	}
	return s.ScheduleDate, true
}

// SetScheduleRepeatPeriod sets value of ScheduleRepeatPeriod conditional field.
func (s *MessagesSendMediaRequest) SetScheduleRepeatPeriod(value int) {
	s.Flags.Set(24)
	s.ScheduleRepeatPeriod = value
}

// GetScheduleRepeatPeriod returns value of ScheduleRepeatPeriod conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetScheduleRepeatPeriod() (value int, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(24) {
		return value, false
	}
	return s.ScheduleRepeatPeriod, true
}

// SetSendAs sets value of SendAs conditional field.
func (s *MessagesSendMediaRequest) SetSendAs(value InputPeerClass) {
	s.Flags.Set(13)
	s.SendAs = value
}

// GetSendAs returns value of SendAs conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetSendAs() (value InputPeerClass, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(13) {
		return value, false
	}
	return s.SendAs, true
}

// SetQuickReplyShortcut sets value of QuickReplyShortcut conditional field.
func (s *MessagesSendMediaRequest) SetQuickReplyShortcut(value InputQuickReplyShortcutClass) {
	s.Flags.Set(17)
	s.QuickReplyShortcut = value
}

// GetQuickReplyShortcut returns value of QuickReplyShortcut conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetQuickReplyShortcut() (value InputQuickReplyShortcutClass, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(17) {
		return value, false
	}
	return s.QuickReplyShortcut, true
}

// SetEffect sets value of Effect conditional field.
func (s *MessagesSendMediaRequest) SetEffect(value int64) {
	s.Flags.Set(18)
	s.Effect = value
}

// GetEffect returns value of Effect conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetEffect() (value int64, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(18) {
		return value, false
	}
	return s.Effect, true
}

// SetAllowPaidStars sets value of AllowPaidStars conditional field.
func (s *MessagesSendMediaRequest) SetAllowPaidStars(value int64) {
	s.Flags.Set(21)
	s.AllowPaidStars = value
}

// GetAllowPaidStars returns value of AllowPaidStars conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetAllowPaidStars() (value int64, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(21) {
		return value, false
	}
	return s.AllowPaidStars, true
}

// SetSuggestedPost sets value of SuggestedPost conditional field.
func (s *MessagesSendMediaRequest) SetSuggestedPost(value SuggestedPost) {
	s.Flags.Set(22)
	s.SuggestedPost = value
}

// GetSuggestedPost returns value of SuggestedPost conditional field and
// boolean which is true if field was set.
func (s *MessagesSendMediaRequest) GetSuggestedPost() (value SuggestedPost, ok bool) {
	if s == nil {
		return
	}
	if !s.Flags.Has(22) {
		return value, false
	}
	return s.SuggestedPost, true
}

// MapEntities returns field Entities wrapped in MessageEntityClassArray helper.
func (s *MessagesSendMediaRequest) MapEntities() (value MessageEntityClassArray, ok bool) {
	if !s.Flags.Has(3) {
		return value, false
	}
	return MessageEntityClassArray(s.Entities), true
}

// MessagesSendMedia invokes method messages.sendMedia#330e77f returning error if any.
// Send a media
//
// Possible errors:
//
//	406 ALLOW_PAYMENT_REQUIRED: This peer only accepts paid messages »: this error is only emitted for older layers without paid messages support, so the client must be updated in order to use paid messages.  .
//	403 ALLOW_PAYMENT_REQUIRED_%d: This peer charges %d Telegram Stars per message, but the allow_paid_stars was not set or its value is smaller than %d.
//	400 BOT_GAMES_DISABLED: Games can't be sent to channels.
//	400 BOT_PAYMENTS_DISABLED: Please enable bot payments in botfather before calling this method.
//	400 BROADCAST_PUBLIC_VOTERS_FORBIDDEN: You can't forward polls with public voters.
//	400 BUSINESS_CONNECTION_INVALID: The connection_id passed to the wrapping invokeWithBusinessConnection call is invalid.
//	400 BUSINESS_PEER_INVALID: Messages can't be set to the specified peer through the current business connection.
//	400 BUTTON_COPY_TEXT_INVALID: The specified keyboardButtonCopy.copy_text is invalid.
//	400 BUTTON_DATA_INVALID: The data of one or more of the buttons you provided is invalid.
//	400 BUTTON_POS_INVALID: The position of one of the keyboard buttons is invalid (i.e. a Game or Pay button not in the first position, and so on...).
//	400 BUTTON_TYPE_INVALID: The type of one or more of the buttons you provided is invalid.
//	400 BUTTON_URL_INVALID: Button URL invalid.
//	400 BUTTON_USER_PRIVACY_RESTRICTED: The privacy setting of the user specified in a inputKeyboardButtonUserProfile button do not allow creating such a button.
//	400 CHANNEL_INVALID: The provided channel is invalid.
//	406 CHANNEL_PRIVATE: You haven't joined this channel/supergroup.
//	403 CHAT_ADMIN_REQUIRED: You must be an admin in this chat to do this.
//	400 CHAT_FORWARDS_RESTRICTED: You can't forward messages from a protected chat.
//	403 CHAT_GUEST_SEND_FORBIDDEN: You join the discussion group before commenting, see here » for more info.
//	400 CHAT_RESTRICTED: You can't send messages in this chat, you were restricted.
//	403 CHAT_SEND_AUDIOS_FORBIDDEN: You can't send audio messages in this chat.
//	403 CHAT_SEND_DOCS_FORBIDDEN: You can't send documents in this chat.
//	403 CHAT_SEND_GIFS_FORBIDDEN: You can't send gifs in this chat.
//	403 CHAT_SEND_MEDIA_FORBIDDEN: You can't send media in this chat.
//	403 CHAT_SEND_PHOTOS_FORBIDDEN: You can't send photos in this chat.
//	403 CHAT_SEND_PLAIN_FORBIDDEN: You can't send non-media (text) messages in this chat.
//	403 CHAT_SEND_POLL_FORBIDDEN: You can't send polls in this chat.
//	403 CHAT_SEND_ROUNDVIDEOS_FORBIDDEN: You can't send round videos to this chat.
//	403 CHAT_SEND_STICKERS_FORBIDDEN: You can't send stickers in this chat.
//	403 CHAT_SEND_VIDEOS_FORBIDDEN: You can't send videos in this chat.
//	403 CHAT_SEND_VOICES_FORBIDDEN: You can't send voice recordings in this chat.
//	403 CHAT_WRITE_FORBIDDEN: You can't write in this chat.
//	400 CURRENCY_TOTAL_AMOUNT_INVALID: The total amount of all prices is invalid.
//	400 DOCUMENT_INVALID: The specified document is invalid.
//	400 EFFECT_ID_INVALID: The specified effect ID is invalid.
//	400 EMOTICON_INVALID: The specified emoji is invalid.
//	400 ENTITY_BOUNDS_INVALID: A specified entity offset or length is invalid, see here » for info on how to properly compute the entity offset/length.
//	400 EXTENDED_MEDIA_AMOUNT_INVALID: The specified stars_amount of the passed inputMediaPaidMedia is invalid.
//	400 EXTENDED_MEDIA_INVALID: The specified paid media is invalid.
//	400 EXTERNAL_URL_INVALID: External URL invalid.
//	400 FILE_PARTS_INVALID: The number of file parts is invalid.
//	400 FILE_PART_LENGTH_INVALID: The length of a file part is invalid.
//	400 FILE_REFERENCE_EMPTY: An empty file reference was specified.
//	400 FILE_REFERENCE_EXPIRED: File reference expired, it must be refetched as described in the documentation.
//	400 GAME_BOT_INVALID: Bots can't send another bot's game.
//	400 IMAGE_PROCESS_FAILED: Failure while processing image.
//	400 INPUT_FILE_INVALID: The specified InputFile is invalid.
//	400 INPUT_USER_DEACTIVATED: The specified user was deleted.
//	400 INVOICE_PAYLOAD_INVALID: The specified invoice payload is invalid.
//	400 MD5_CHECKSUM_INVALID: The MD5 checksums do not match.
//	400 MEDIA_CAPTION_TOO_LONG: The caption is too long.
//	400 MEDIA_EMPTY: The provided media object is invalid.
//	400 MEDIA_INVALID: Media invalid.
//	400 MESSAGE_EMPTY: The provided message is empty.
//	400 MSG_ID_INVALID: Invalid message ID provided.
//	400 PAYMENT_PROVIDER_INVALID: The specified payment provider is invalid.
//	406 PEER_ID_INVALID: The provided peer id is invalid.
//	400 PHOTO_EXT_INVALID: The extension of the photo is invalid.
//	400 PHOTO_INVALID_DIMENSIONS: The photo dimensions are invalid.
//	400 PHOTO_SAVE_FILE_INVALID: Internal issues, try again later.
//	400 POLL_ANSWERS_INVALID: Invalid poll answers were provided.
//	400 POLL_ANSWER_INVALID: One of the poll answers is not acceptable.
//	400 POLL_OPTION_DUPLICATE: Duplicate poll options provided.
//	400 POLL_OPTION_INVALID: Invalid poll option provided.
//	400 POLL_QUESTION_INVALID: One of the poll questions is not acceptable.
//	403 PREMIUM_ACCOUNT_REQUIRED: A premium account is required to execute this action.
//	403 PRIVACY_PREMIUM_REQUIRED: You need a Telegram Premium subscription to send a message to this user.
//	400 QUICK_REPLIES_BOT_NOT_ALLOWED: Quick replies cannot be used by bots.
//	400 QUICK_REPLIES_TOO_MUCH: A maximum of appConfig.quick_replies_limit shortcuts may be created, the limit was reached.
//	400 QUIZ_CORRECT_ANSWERS_EMPTY: No correct quiz answer was specified.
//	400 QUIZ_CORRECT_ANSWERS_TOO_MUCH: You specified too many correct answers in a quiz, quizzes can only have one right answer!
//	400 QUIZ_CORRECT_ANSWER_INVALID: An invalid value was provided to the correct_answers field.
//	400 QUIZ_MULTIPLE_INVALID: Quizzes can't have the multiple_choice flag set!
//	500 RANDOM_ID_DUPLICATE: You provided a random ID that was already used.
//	400 REPLY_MARKUP_BUY_EMPTY: Reply markup for buy button empty.
//	400 REPLY_MARKUP_GAME_EMPTY: A game message is being edited, but the newly provided keyboard doesn't have a keyboardButtonGame button.
//	400 REPLY_MARKUP_INVALID: The provided reply markup is invalid.
//	400 REPLY_MARKUP_TOO_LONG: The specified reply_markup is too long.
//	400 REPLY_MESSAGES_TOO_MUCH: Each shortcut can contain a maximum of appConfig.quick_reply_messages_limit messages, the limit was reached.
//	400 REPLY_MESSAGE_ID_INVALID: The specified reply-to message ID is invalid.
//	400 SCHEDULE_BOT_NOT_ALLOWED: Bots cannot schedule messages.
//	400 SCHEDULE_DATE_TOO_LATE: You can't schedule a message this far in the future.
//	400 SCHEDULE_TOO_MUCH: There are too many scheduled messages.
//	400 SEND_AS_PEER_INVALID: You can't send messages as the specified peer.
//	420 SLOWMODE_WAIT_%d: Slowmode is enabled in this chat: wait %d seconds before sending another message to this chat.
//	400 STARS_INVOICE_INVALID: The specified Telegram Star invoice is invalid.
//	400 STORY_ID_INVALID: The specified story ID is invalid.
//	400 SUBSCRIPTION_EXPORT_MISSING: You cannot send a bot subscription invoice directly, you may only create invoice links using payments.exportInvoice.
//	400 SUGGESTED_POST_PEER_INVALID: You cannot send suggested posts to non-monoforum peers.
//	400 TERMS_URL_INVALID: The specified invoice.terms_url is invalid.
//	400 TODO_ITEMS_EMPTY: A checklist was specified, but no checklist items were passed.
//	400 TODO_ITEM_DUPLICATE: Duplicate checklist items detected.
//	406 TOPIC_CLOSED: This topic was closed, you can't send messages to it anymore.
//	406 TOPIC_DELETED: The specified topic was deleted.
//	400 TTL_MEDIA_INVALID: Invalid media Time To Live was provided.
//	400 USER_BANNED_IN_CHANNEL: You're banned from sending messages in supergroups/channels.
//	403 USER_IS_BLOCKED: You were blocked by this user.
//	400 USER_IS_BOT: Bots can't send messages to other bots.
//	400 VIDEO_CONTENT_TYPE_INVALID: The video's content type is invalid.
//	400 VOICE_MESSAGES_FORBIDDEN: This user's privacy settings forbid you from sending voice messages.
//	400 WEBDOCUMENT_MIME_INVALID: Invalid webdocument mime type provided.
//	400 WEBPAGE_CURL_FAILED: Failure while fetching the webpage with cURL.
//	400 WEBPAGE_MEDIA_EMPTY: Webpage media empty.
//	400 WEBPAGE_NOT_FOUND: A preview for the specified webpage url could not be generated.
//	400 WEBPAGE_URL_INVALID: The specified webpage url is invalid.
//	400 YOU_BLOCKED_USER: You blocked this user.
//
// See https://core.telegram.org/method/messages.sendMedia for reference.
func (c *Client) MessagesSendMedia(ctx context.Context, request *MessagesSendMediaRequest) (UpdatesClass, error) {
	var result UpdatesBox

	if err := c.rpc.Invoke(ctx, request, &result); err != nil {
		return nil, err
	}
	return result.Updates, nil
}
