// Code generated by gotdgen, DO NOT EDIT.

package tdapi

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{}
)

// ChatActionBarReportSpam represents TL type `chatActionBarReportSpam#b1c0e61a`.
type ChatActionBarReportSpam struct {
	// If true, the chat was automatically archived and can be moved back to the main chat
	// list using addChatToList simultaneously with setting chat notification settings to
	// default using setChatNotificationSettings
	CanUnarchive bool
}

// ChatActionBarReportSpamTypeID is TL type id of ChatActionBarReportSpam.
const ChatActionBarReportSpamTypeID = 0xb1c0e61a

// construct implements constructor of ChatActionBarClass.
func (c ChatActionBarReportSpam) construct() ChatActionBarClass { return &c }

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

	_ ChatActionBarClass = &ChatActionBarReportSpam{}
)

func (c *ChatActionBarReportSpam) Zero() bool {
	if c == nil {
		return true
	}
	if !(c.CanUnarchive == false) {
		return false
	}

	return true
}

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

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

// TypeName returns name of type in TL schema.
func (*ChatActionBarReportSpam) TypeName() string {
	return "chatActionBarReportSpam"
}

// TypeInfo returns info about TL type.
func (c *ChatActionBarReportSpam) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "chatActionBarReportSpam",
		ID:   ChatActionBarReportSpamTypeID,
	}
	if c == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "CanUnarchive",
			SchemaName: "can_unarchive",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (c *ChatActionBarReportSpam) Encode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarReportSpam#b1c0e61a as nil")
	}
	b.PutID(ChatActionBarReportSpamTypeID)
	return c.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (c *ChatActionBarReportSpam) EncodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarReportSpam#b1c0e61a as nil")
	}
	b.PutBool(c.CanUnarchive)
	return nil
}

// Decode implements bin.Decoder.
func (c *ChatActionBarReportSpam) Decode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarReportSpam#b1c0e61a to nil")
	}
	if err := b.ConsumeID(ChatActionBarReportSpamTypeID); err != nil {
		return fmt.Errorf("unable to decode chatActionBarReportSpam#b1c0e61a: %w", err)
	}
	return c.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (c *ChatActionBarReportSpam) DecodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarReportSpam#b1c0e61a to nil")
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode chatActionBarReportSpam#b1c0e61a: field can_unarchive: %w", err)
		}
		c.CanUnarchive = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (c *ChatActionBarReportSpam) EncodeTDLibJSON(b tdjson.Encoder) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarReportSpam#b1c0e61a as nil")
	}
	b.ObjStart()
	b.PutID("chatActionBarReportSpam")
	b.Comma()
	b.FieldStart("can_unarchive")
	b.PutBool(c.CanUnarchive)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (c *ChatActionBarReportSpam) DecodeTDLibJSON(b tdjson.Decoder) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarReportSpam#b1c0e61a to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("chatActionBarReportSpam"); err != nil {
				return fmt.Errorf("unable to decode chatActionBarReportSpam#b1c0e61a: %w", err)
			}
		case "can_unarchive":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode chatActionBarReportSpam#b1c0e61a: field can_unarchive: %w", err)
			}
			c.CanUnarchive = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetCanUnarchive returns value of CanUnarchive field.
func (c *ChatActionBarReportSpam) GetCanUnarchive() (value bool) {
	if c == nil {
		return
	}
	return c.CanUnarchive
}

// ChatActionBarInviteMembers represents TL type `chatActionBarInviteMembers#76557c70`.
type ChatActionBarInviteMembers struct {
}

// ChatActionBarInviteMembersTypeID is TL type id of ChatActionBarInviteMembers.
const ChatActionBarInviteMembersTypeID = 0x76557c70

// construct implements constructor of ChatActionBarClass.
func (c ChatActionBarInviteMembers) construct() ChatActionBarClass { return &c }

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

	_ ChatActionBarClass = &ChatActionBarInviteMembers{}
)

func (c *ChatActionBarInviteMembers) Zero() bool {
	if c == nil {
		return true
	}

	return true
}

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

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

// TypeName returns name of type in TL schema.
func (*ChatActionBarInviteMembers) TypeName() string {
	return "chatActionBarInviteMembers"
}

// TypeInfo returns info about TL type.
func (c *ChatActionBarInviteMembers) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "chatActionBarInviteMembers",
		ID:   ChatActionBarInviteMembersTypeID,
	}
	if c == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (c *ChatActionBarInviteMembers) Encode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarInviteMembers#76557c70 as nil")
	}
	b.PutID(ChatActionBarInviteMembersTypeID)
	return c.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (c *ChatActionBarInviteMembers) EncodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarInviteMembers#76557c70 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (c *ChatActionBarInviteMembers) Decode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarInviteMembers#76557c70 to nil")
	}
	if err := b.ConsumeID(ChatActionBarInviteMembersTypeID); err != nil {
		return fmt.Errorf("unable to decode chatActionBarInviteMembers#76557c70: %w", err)
	}
	return c.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (c *ChatActionBarInviteMembers) DecodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarInviteMembers#76557c70 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (c *ChatActionBarInviteMembers) EncodeTDLibJSON(b tdjson.Encoder) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarInviteMembers#76557c70 as nil")
	}
	b.ObjStart()
	b.PutID("chatActionBarInviteMembers")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (c *ChatActionBarInviteMembers) DecodeTDLibJSON(b tdjson.Decoder) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarInviteMembers#76557c70 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("chatActionBarInviteMembers"); err != nil {
				return fmt.Errorf("unable to decode chatActionBarInviteMembers#76557c70: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// ChatActionBarReportAddBlock represents TL type `chatActionBarReportAddBlock#a7f98e8b`.
type ChatActionBarReportAddBlock struct {
	// If true, the chat was automatically archived and can be moved back to the main chat
	// list using addChatToList simultaneously with setting chat notification settings to
	// default using setChatNotificationSettings
	CanUnarchive bool
	// Basic information about the other user in the chat; may be null if unknown
	AccountInfo AccountInfo
}

// ChatActionBarReportAddBlockTypeID is TL type id of ChatActionBarReportAddBlock.
const ChatActionBarReportAddBlockTypeID = 0xa7f98e8b

// construct implements constructor of ChatActionBarClass.
func (c ChatActionBarReportAddBlock) construct() ChatActionBarClass { return &c }

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

	_ ChatActionBarClass = &ChatActionBarReportAddBlock{}
)

func (c *ChatActionBarReportAddBlock) Zero() bool {
	if c == nil {
		return true
	}
	if !(c.CanUnarchive == false) {
		return false
	}
	if !(c.AccountInfo.Zero()) {
		return false
	}

	return true
}

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

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

// TypeName returns name of type in TL schema.
func (*ChatActionBarReportAddBlock) TypeName() string {
	return "chatActionBarReportAddBlock"
}

// TypeInfo returns info about TL type.
func (c *ChatActionBarReportAddBlock) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "chatActionBarReportAddBlock",
		ID:   ChatActionBarReportAddBlockTypeID,
	}
	if c == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "CanUnarchive",
			SchemaName: "can_unarchive",
		},
		{
			Name:       "AccountInfo",
			SchemaName: "account_info",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (c *ChatActionBarReportAddBlock) Encode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarReportAddBlock#a7f98e8b as nil")
	}
	b.PutID(ChatActionBarReportAddBlockTypeID)
	return c.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (c *ChatActionBarReportAddBlock) EncodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarReportAddBlock#a7f98e8b as nil")
	}
	b.PutBool(c.CanUnarchive)
	if err := c.AccountInfo.Encode(b); err != nil {
		return fmt.Errorf("unable to encode chatActionBarReportAddBlock#a7f98e8b: field account_info: %w", err)
	}
	return nil
}

// Decode implements bin.Decoder.
func (c *ChatActionBarReportAddBlock) Decode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarReportAddBlock#a7f98e8b to nil")
	}
	if err := b.ConsumeID(ChatActionBarReportAddBlockTypeID); err != nil {
		return fmt.Errorf("unable to decode chatActionBarReportAddBlock#a7f98e8b: %w", err)
	}
	return c.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (c *ChatActionBarReportAddBlock) DecodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarReportAddBlock#a7f98e8b to nil")
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode chatActionBarReportAddBlock#a7f98e8b: field can_unarchive: %w", err)
		}
		c.CanUnarchive = value
	}
	{
		if err := c.AccountInfo.Decode(b); err != nil {
			return fmt.Errorf("unable to decode chatActionBarReportAddBlock#a7f98e8b: field account_info: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (c *ChatActionBarReportAddBlock) EncodeTDLibJSON(b tdjson.Encoder) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarReportAddBlock#a7f98e8b as nil")
	}
	b.ObjStart()
	b.PutID("chatActionBarReportAddBlock")
	b.Comma()
	b.FieldStart("can_unarchive")
	b.PutBool(c.CanUnarchive)
	b.Comma()
	b.FieldStart("account_info")
	if err := c.AccountInfo.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode chatActionBarReportAddBlock#a7f98e8b: field account_info: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (c *ChatActionBarReportAddBlock) DecodeTDLibJSON(b tdjson.Decoder) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarReportAddBlock#a7f98e8b to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("chatActionBarReportAddBlock"); err != nil {
				return fmt.Errorf("unable to decode chatActionBarReportAddBlock#a7f98e8b: %w", err)
			}
		case "can_unarchive":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode chatActionBarReportAddBlock#a7f98e8b: field can_unarchive: %w", err)
			}
			c.CanUnarchive = value
		case "account_info":
			if err := c.AccountInfo.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode chatActionBarReportAddBlock#a7f98e8b: field account_info: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetCanUnarchive returns value of CanUnarchive field.
func (c *ChatActionBarReportAddBlock) GetCanUnarchive() (value bool) {
	if c == nil {
		return
	}
	return c.CanUnarchive
}

// GetAccountInfo returns value of AccountInfo field.
func (c *ChatActionBarReportAddBlock) GetAccountInfo() (value AccountInfo) {
	if c == nil {
		return
	}
	return c.AccountInfo
}

// ChatActionBarAddContact represents TL type `chatActionBarAddContact#d44a5811`.
type ChatActionBarAddContact struct {
}

// ChatActionBarAddContactTypeID is TL type id of ChatActionBarAddContact.
const ChatActionBarAddContactTypeID = 0xd44a5811

// construct implements constructor of ChatActionBarClass.
func (c ChatActionBarAddContact) construct() ChatActionBarClass { return &c }

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

	_ ChatActionBarClass = &ChatActionBarAddContact{}
)

func (c *ChatActionBarAddContact) Zero() bool {
	if c == nil {
		return true
	}

	return true
}

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

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

// TypeName returns name of type in TL schema.
func (*ChatActionBarAddContact) TypeName() string {
	return "chatActionBarAddContact"
}

// TypeInfo returns info about TL type.
func (c *ChatActionBarAddContact) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "chatActionBarAddContact",
		ID:   ChatActionBarAddContactTypeID,
	}
	if c == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (c *ChatActionBarAddContact) Encode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarAddContact#d44a5811 as nil")
	}
	b.PutID(ChatActionBarAddContactTypeID)
	return c.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (c *ChatActionBarAddContact) EncodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarAddContact#d44a5811 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (c *ChatActionBarAddContact) Decode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarAddContact#d44a5811 to nil")
	}
	if err := b.ConsumeID(ChatActionBarAddContactTypeID); err != nil {
		return fmt.Errorf("unable to decode chatActionBarAddContact#d44a5811: %w", err)
	}
	return c.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (c *ChatActionBarAddContact) DecodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarAddContact#d44a5811 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (c *ChatActionBarAddContact) EncodeTDLibJSON(b tdjson.Encoder) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarAddContact#d44a5811 as nil")
	}
	b.ObjStart()
	b.PutID("chatActionBarAddContact")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (c *ChatActionBarAddContact) DecodeTDLibJSON(b tdjson.Decoder) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarAddContact#d44a5811 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("chatActionBarAddContact"); err != nil {
				return fmt.Errorf("unable to decode chatActionBarAddContact#d44a5811: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// ChatActionBarSharePhoneNumber represents TL type `chatActionBarSharePhoneNumber#218efd9`.
type ChatActionBarSharePhoneNumber struct {
}

// ChatActionBarSharePhoneNumberTypeID is TL type id of ChatActionBarSharePhoneNumber.
const ChatActionBarSharePhoneNumberTypeID = 0x218efd9

// construct implements constructor of ChatActionBarClass.
func (c ChatActionBarSharePhoneNumber) construct() ChatActionBarClass { return &c }

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

	_ ChatActionBarClass = &ChatActionBarSharePhoneNumber{}
)

func (c *ChatActionBarSharePhoneNumber) Zero() bool {
	if c == nil {
		return true
	}

	return true
}

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

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

// TypeName returns name of type in TL schema.
func (*ChatActionBarSharePhoneNumber) TypeName() string {
	return "chatActionBarSharePhoneNumber"
}

// TypeInfo returns info about TL type.
func (c *ChatActionBarSharePhoneNumber) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "chatActionBarSharePhoneNumber",
		ID:   ChatActionBarSharePhoneNumberTypeID,
	}
	if c == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (c *ChatActionBarSharePhoneNumber) Encode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarSharePhoneNumber#218efd9 as nil")
	}
	b.PutID(ChatActionBarSharePhoneNumberTypeID)
	return c.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (c *ChatActionBarSharePhoneNumber) EncodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarSharePhoneNumber#218efd9 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (c *ChatActionBarSharePhoneNumber) Decode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarSharePhoneNumber#218efd9 to nil")
	}
	if err := b.ConsumeID(ChatActionBarSharePhoneNumberTypeID); err != nil {
		return fmt.Errorf("unable to decode chatActionBarSharePhoneNumber#218efd9: %w", err)
	}
	return c.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (c *ChatActionBarSharePhoneNumber) DecodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarSharePhoneNumber#218efd9 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (c *ChatActionBarSharePhoneNumber) EncodeTDLibJSON(b tdjson.Encoder) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarSharePhoneNumber#218efd9 as nil")
	}
	b.ObjStart()
	b.PutID("chatActionBarSharePhoneNumber")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (c *ChatActionBarSharePhoneNumber) DecodeTDLibJSON(b tdjson.Decoder) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarSharePhoneNumber#218efd9 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("chatActionBarSharePhoneNumber"); err != nil {
				return fmt.Errorf("unable to decode chatActionBarSharePhoneNumber#218efd9: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// ChatActionBarJoinRequest represents TL type `chatActionBarJoinRequest#3dd18308`.
type ChatActionBarJoinRequest struct {
	// Title of the chat to which the join request was sent
	Title string
	// True, if the join request was sent to a channel chat
	IsChannel bool
	// Point in time (Unix timestamp) when the join request was sent
	RequestDate int32
}

// ChatActionBarJoinRequestTypeID is TL type id of ChatActionBarJoinRequest.
const ChatActionBarJoinRequestTypeID = 0x3dd18308

// construct implements constructor of ChatActionBarClass.
func (c ChatActionBarJoinRequest) construct() ChatActionBarClass { return &c }

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

	_ ChatActionBarClass = &ChatActionBarJoinRequest{}
)

func (c *ChatActionBarJoinRequest) Zero() bool {
	if c == nil {
		return true
	}
	if !(c.Title == "") {
		return false
	}
	if !(c.IsChannel == false) {
		return false
	}
	if !(c.RequestDate == 0) {
		return false
	}

	return true
}

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

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

// TypeName returns name of type in TL schema.
func (*ChatActionBarJoinRequest) TypeName() string {
	return "chatActionBarJoinRequest"
}

// TypeInfo returns info about TL type.
func (c *ChatActionBarJoinRequest) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "chatActionBarJoinRequest",
		ID:   ChatActionBarJoinRequestTypeID,
	}
	if c == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Title",
			SchemaName: "title",
		},
		{
			Name:       "IsChannel",
			SchemaName: "is_channel",
		},
		{
			Name:       "RequestDate",
			SchemaName: "request_date",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (c *ChatActionBarJoinRequest) Encode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarJoinRequest#3dd18308 as nil")
	}
	b.PutID(ChatActionBarJoinRequestTypeID)
	return c.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (c *ChatActionBarJoinRequest) EncodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarJoinRequest#3dd18308 as nil")
	}
	b.PutString(c.Title)
	b.PutBool(c.IsChannel)
	b.PutInt32(c.RequestDate)
	return nil
}

// Decode implements bin.Decoder.
func (c *ChatActionBarJoinRequest) Decode(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarJoinRequest#3dd18308 to nil")
	}
	if err := b.ConsumeID(ChatActionBarJoinRequestTypeID); err != nil {
		return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: %w", err)
	}
	return c.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (c *ChatActionBarJoinRequest) DecodeBare(b *bin.Buffer) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarJoinRequest#3dd18308 to nil")
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: field title: %w", err)
		}
		c.Title = value
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: field is_channel: %w", err)
		}
		c.IsChannel = value
	}
	{
		value, err := b.Int32()
		if err != nil {
			return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: field request_date: %w", err)
		}
		c.RequestDate = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (c *ChatActionBarJoinRequest) EncodeTDLibJSON(b tdjson.Encoder) error {
	if c == nil {
		return fmt.Errorf("can't encode chatActionBarJoinRequest#3dd18308 as nil")
	}
	b.ObjStart()
	b.PutID("chatActionBarJoinRequest")
	b.Comma()
	b.FieldStart("title")
	b.PutString(c.Title)
	b.Comma()
	b.FieldStart("is_channel")
	b.PutBool(c.IsChannel)
	b.Comma()
	b.FieldStart("request_date")
	b.PutInt32(c.RequestDate)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (c *ChatActionBarJoinRequest) DecodeTDLibJSON(b tdjson.Decoder) error {
	if c == nil {
		return fmt.Errorf("can't decode chatActionBarJoinRequest#3dd18308 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("chatActionBarJoinRequest"); err != nil {
				return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: %w", err)
			}
		case "title":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: field title: %w", err)
			}
			c.Title = value
		case "is_channel":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: field is_channel: %w", err)
			}
			c.IsChannel = value
		case "request_date":
			value, err := b.Int32()
			if err != nil {
				return fmt.Errorf("unable to decode chatActionBarJoinRequest#3dd18308: field request_date: %w", err)
			}
			c.RequestDate = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetTitle returns value of Title field.
func (c *ChatActionBarJoinRequest) GetTitle() (value string) {
	if c == nil {
		return
	}
	return c.Title
}

// GetIsChannel returns value of IsChannel field.
func (c *ChatActionBarJoinRequest) GetIsChannel() (value bool) {
	if c == nil {
		return
	}
	return c.IsChannel
}

// GetRequestDate returns value of RequestDate field.
func (c *ChatActionBarJoinRequest) GetRequestDate() (value int32) {
	if c == nil {
		return
	}
	return c.RequestDate
}

// ChatActionBarClassName is schema name of ChatActionBarClass.
const ChatActionBarClassName = "ChatActionBar"

// ChatActionBarClass represents ChatActionBar generic type.
//
// Example:
//
//	g, err := tdapi.DecodeChatActionBar(buf)
//	if err != nil {
//	    panic(err)
//	}
//	switch v := g.(type) {
//	case *tdapi.ChatActionBarReportSpam: // chatActionBarReportSpam#b1c0e61a
//	case *tdapi.ChatActionBarInviteMembers: // chatActionBarInviteMembers#76557c70
//	case *tdapi.ChatActionBarReportAddBlock: // chatActionBarReportAddBlock#a7f98e8b
//	case *tdapi.ChatActionBarAddContact: // chatActionBarAddContact#d44a5811
//	case *tdapi.ChatActionBarSharePhoneNumber: // chatActionBarSharePhoneNumber#218efd9
//	case *tdapi.ChatActionBarJoinRequest: // chatActionBarJoinRequest#3dd18308
//	default: panic(v)
//	}
type ChatActionBarClass interface {
	bin.Encoder
	bin.Decoder
	bin.BareEncoder
	bin.BareDecoder
	construct() ChatActionBarClass

	// TypeID returns type id in TL schema.
	//
	// See https://core.telegram.org/mtproto/TL-tl#remarks.
	TypeID() uint32
	// TypeName returns name of type in TL schema.
	TypeName() string
	// String implements fmt.Stringer.
	String() string
	// Zero returns true if current object has a zero value.
	Zero() bool

	EncodeTDLibJSON(b tdjson.Encoder) error
	DecodeTDLibJSON(b tdjson.Decoder) error
}

// DecodeChatActionBar implements binary de-serialization for ChatActionBarClass.
func DecodeChatActionBar(buf *bin.Buffer) (ChatActionBarClass, error) {
	id, err := buf.PeekID()
	if err != nil {
		return nil, err
	}
	switch id {
	case ChatActionBarReportSpamTypeID:
		// Decoding chatActionBarReportSpam#b1c0e61a.
		v := ChatActionBarReportSpam{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case ChatActionBarInviteMembersTypeID:
		// Decoding chatActionBarInviteMembers#76557c70.
		v := ChatActionBarInviteMembers{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case ChatActionBarReportAddBlockTypeID:
		// Decoding chatActionBarReportAddBlock#a7f98e8b.
		v := ChatActionBarReportAddBlock{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case ChatActionBarAddContactTypeID:
		// Decoding chatActionBarAddContact#d44a5811.
		v := ChatActionBarAddContact{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case ChatActionBarSharePhoneNumberTypeID:
		// Decoding chatActionBarSharePhoneNumber#218efd9.
		v := ChatActionBarSharePhoneNumber{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case ChatActionBarJoinRequestTypeID:
		// Decoding chatActionBarJoinRequest#3dd18308.
		v := ChatActionBarJoinRequest{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", bin.NewUnexpectedID(id))
	}
}

// DecodeTDLibJSONChatActionBar implements binary de-serialization for ChatActionBarClass.
func DecodeTDLibJSONChatActionBar(buf tdjson.Decoder) (ChatActionBarClass, error) {
	id, err := buf.FindTypeID()
	if err != nil {
		return nil, err
	}
	switch id {
	case "chatActionBarReportSpam":
		// Decoding chatActionBarReportSpam#b1c0e61a.
		v := ChatActionBarReportSpam{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case "chatActionBarInviteMembers":
		// Decoding chatActionBarInviteMembers#76557c70.
		v := ChatActionBarInviteMembers{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case "chatActionBarReportAddBlock":
		// Decoding chatActionBarReportAddBlock#a7f98e8b.
		v := ChatActionBarReportAddBlock{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case "chatActionBarAddContact":
		// Decoding chatActionBarAddContact#d44a5811.
		v := ChatActionBarAddContact{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case "chatActionBarSharePhoneNumber":
		// Decoding chatActionBarSharePhoneNumber#218efd9.
		v := ChatActionBarSharePhoneNumber{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	case "chatActionBarJoinRequest":
		// Decoding chatActionBarJoinRequest#3dd18308.
		v := ChatActionBarJoinRequest{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode ChatActionBarClass: %w", tdjson.NewUnexpectedID(id))
	}
}

// ChatActionBar boxes the ChatActionBarClass providing a helper.
type ChatActionBarBox struct {
	ChatActionBar ChatActionBarClass
}

// Decode implements bin.Decoder for ChatActionBarBox.
func (b *ChatActionBarBox) Decode(buf *bin.Buffer) error {
	if b == nil {
		return fmt.Errorf("unable to decode ChatActionBarBox to nil")
	}
	v, err := DecodeChatActionBar(buf)
	if err != nil {
		return fmt.Errorf("unable to decode boxed value: %w", err)
	}
	b.ChatActionBar = v
	return nil
}

// Encode implements bin.Encode for ChatActionBarBox.
func (b *ChatActionBarBox) Encode(buf *bin.Buffer) error {
	if b == nil || b.ChatActionBar == nil {
		return fmt.Errorf("unable to encode ChatActionBarClass as nil")
	}
	return b.ChatActionBar.Encode(buf)
}

// DecodeTDLibJSON implements bin.Decoder for ChatActionBarBox.
func (b *ChatActionBarBox) DecodeTDLibJSON(buf tdjson.Decoder) error {
	if b == nil {
		return fmt.Errorf("unable to decode ChatActionBarBox to nil")
	}
	v, err := DecodeTDLibJSONChatActionBar(buf)
	if err != nil {
		return fmt.Errorf("unable to decode boxed value: %w", err)
	}
	b.ChatActionBar = v
	return nil
}

// EncodeTDLibJSON implements bin.Encode for ChatActionBarBox.
func (b *ChatActionBarBox) EncodeTDLibJSON(buf tdjson.Encoder) error {
	if b == nil || b.ChatActionBar == nil {
		return fmt.Errorf("unable to encode ChatActionBarClass as nil")
	}
	return b.ChatActionBar.EncodeTDLibJSON(buf)
}
