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

// SetTdlibParametersRequest represents TL type `setTdlibParameters#d1c0f62e`.
type SetTdlibParametersRequest struct {
	// Pass true to use Telegram test environment instead of the production environment
	UseTestDC bool
	// The path to the directory for the persistent database; if empty, the current working
	// directory will be used
	DatabaseDirectory string
	// The path to the directory for storing files; if empty, database_directory will be used
	FilesDirectory string
	// Encryption key for the database. If the encryption key is invalid, then an error with
	// code 401 will be returned
	DatabaseEncryptionKey []byte
	// Pass true to keep information about downloaded and uploaded files between application
	// restarts
	UseFileDatabase bool
	// Pass true to keep cache of users, basic groups, supergroups, channels and secret chats
	// between restarts. Implies use_file_database
	UseChatInfoDatabase bool
	// Pass true to keep cache of chats and messages between restarts. Implies
	// use_chat_info_database
	UseMessageDatabase bool
	// Pass true to enable support for secret chats
	UseSecretChats bool
	// Application identifier for Telegram API access, which can be obtained at https://my
	// telegram.org
	APIID int32
	// Application identifier hash for Telegram API access, which can be obtained at
	// https://my.telegram.org
	APIHash string
	// IETF language tag of the user's operating system language; must be non-empty
	SystemLanguageCode string
	// Model of the device the application is being run on; must be non-empty
	DeviceModel string
	// Version of the operating system the application is being run on. If empty, the version
	// is automatically detected by TDLib
	SystemVersion string
	// Application version; must be non-empty
	ApplicationVersion string
}

// SetTdlibParametersRequestTypeID is TL type id of SetTdlibParametersRequest.
const SetTdlibParametersRequestTypeID = 0xd1c0f62e

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

func (s *SetTdlibParametersRequest) Zero() bool {
	if s == nil {
		return true
	}
	if !(s.UseTestDC == false) {
		return false
	}
	if !(s.DatabaseDirectory == "") {
		return false
	}
	if !(s.FilesDirectory == "") {
		return false
	}
	if !(s.DatabaseEncryptionKey == nil) {
		return false
	}
	if !(s.UseFileDatabase == false) {
		return false
	}
	if !(s.UseChatInfoDatabase == false) {
		return false
	}
	if !(s.UseMessageDatabase == false) {
		return false
	}
	if !(s.UseSecretChats == false) {
		return false
	}
	if !(s.APIID == 0) {
		return false
	}
	if !(s.APIHash == "") {
		return false
	}
	if !(s.SystemLanguageCode == "") {
		return false
	}
	if !(s.DeviceModel == "") {
		return false
	}
	if !(s.SystemVersion == "") {
		return false
	}
	if !(s.ApplicationVersion == "") {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SetTdlibParametersRequest) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "setTdlibParameters",
		ID:   SetTdlibParametersRequestTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "UseTestDC",
			SchemaName: "use_test_dc",
		},
		{
			Name:       "DatabaseDirectory",
			SchemaName: "database_directory",
		},
		{
			Name:       "FilesDirectory",
			SchemaName: "files_directory",
		},
		{
			Name:       "DatabaseEncryptionKey",
			SchemaName: "database_encryption_key",
		},
		{
			Name:       "UseFileDatabase",
			SchemaName: "use_file_database",
		},
		{
			Name:       "UseChatInfoDatabase",
			SchemaName: "use_chat_info_database",
		},
		{
			Name:       "UseMessageDatabase",
			SchemaName: "use_message_database",
		},
		{
			Name:       "UseSecretChats",
			SchemaName: "use_secret_chats",
		},
		{
			Name:       "APIID",
			SchemaName: "api_id",
		},
		{
			Name:       "APIHash",
			SchemaName: "api_hash",
		},
		{
			Name:       "SystemLanguageCode",
			SchemaName: "system_language_code",
		},
		{
			Name:       "DeviceModel",
			SchemaName: "device_model",
		},
		{
			Name:       "SystemVersion",
			SchemaName: "system_version",
		},
		{
			Name:       "ApplicationVersion",
			SchemaName: "application_version",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (s *SetTdlibParametersRequest) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode setTdlibParameters#d1c0f62e as nil")
	}
	b.PutID(SetTdlibParametersRequestTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SetTdlibParametersRequest) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode setTdlibParameters#d1c0f62e as nil")
	}
	b.PutBool(s.UseTestDC)
	b.PutString(s.DatabaseDirectory)
	b.PutString(s.FilesDirectory)
	b.PutBytes(s.DatabaseEncryptionKey)
	b.PutBool(s.UseFileDatabase)
	b.PutBool(s.UseChatInfoDatabase)
	b.PutBool(s.UseMessageDatabase)
	b.PutBool(s.UseSecretChats)
	b.PutInt32(s.APIID)
	b.PutString(s.APIHash)
	b.PutString(s.SystemLanguageCode)
	b.PutString(s.DeviceModel)
	b.PutString(s.SystemVersion)
	b.PutString(s.ApplicationVersion)
	return nil
}

// Decode implements bin.Decoder.
func (s *SetTdlibParametersRequest) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode setTdlibParameters#d1c0f62e to nil")
	}
	if err := b.ConsumeID(SetTdlibParametersRequestTypeID); err != nil {
		return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SetTdlibParametersRequest) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode setTdlibParameters#d1c0f62e to nil")
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_test_dc: %w", err)
		}
		s.UseTestDC = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field database_directory: %w", err)
		}
		s.DatabaseDirectory = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field files_directory: %w", err)
		}
		s.FilesDirectory = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field database_encryption_key: %w", err)
		}
		s.DatabaseEncryptionKey = value
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_file_database: %w", err)
		}
		s.UseFileDatabase = value
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_chat_info_database: %w", err)
		}
		s.UseChatInfoDatabase = value
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_message_database: %w", err)
		}
		s.UseMessageDatabase = value
	}
	{
		value, err := b.Bool()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_secret_chats: %w", err)
		}
		s.UseSecretChats = value
	}
	{
		value, err := b.Int32()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field api_id: %w", err)
		}
		s.APIID = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field api_hash: %w", err)
		}
		s.APIHash = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field system_language_code: %w", err)
		}
		s.SystemLanguageCode = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field device_model: %w", err)
		}
		s.DeviceModel = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field system_version: %w", err)
		}
		s.SystemVersion = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field application_version: %w", err)
		}
		s.ApplicationVersion = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SetTdlibParametersRequest) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode setTdlibParameters#d1c0f62e as nil")
	}
	b.ObjStart()
	b.PutID("setTdlibParameters")
	b.Comma()
	b.FieldStart("use_test_dc")
	b.PutBool(s.UseTestDC)
	b.Comma()
	b.FieldStart("database_directory")
	b.PutString(s.DatabaseDirectory)
	b.Comma()
	b.FieldStart("files_directory")
	b.PutString(s.FilesDirectory)
	b.Comma()
	b.FieldStart("database_encryption_key")
	b.PutBytes(s.DatabaseEncryptionKey)
	b.Comma()
	b.FieldStart("use_file_database")
	b.PutBool(s.UseFileDatabase)
	b.Comma()
	b.FieldStart("use_chat_info_database")
	b.PutBool(s.UseChatInfoDatabase)
	b.Comma()
	b.FieldStart("use_message_database")
	b.PutBool(s.UseMessageDatabase)
	b.Comma()
	b.FieldStart("use_secret_chats")
	b.PutBool(s.UseSecretChats)
	b.Comma()
	b.FieldStart("api_id")
	b.PutInt32(s.APIID)
	b.Comma()
	b.FieldStart("api_hash")
	b.PutString(s.APIHash)
	b.Comma()
	b.FieldStart("system_language_code")
	b.PutString(s.SystemLanguageCode)
	b.Comma()
	b.FieldStart("device_model")
	b.PutString(s.DeviceModel)
	b.Comma()
	b.FieldStart("system_version")
	b.PutString(s.SystemVersion)
	b.Comma()
	b.FieldStart("application_version")
	b.PutString(s.ApplicationVersion)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SetTdlibParametersRequest) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode setTdlibParameters#d1c0f62e to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("setTdlibParameters"); err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: %w", err)
			}
		case "use_test_dc":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_test_dc: %w", err)
			}
			s.UseTestDC = value
		case "database_directory":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field database_directory: %w", err)
			}
			s.DatabaseDirectory = value
		case "files_directory":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field files_directory: %w", err)
			}
			s.FilesDirectory = value
		case "database_encryption_key":
			value, err := b.Bytes()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field database_encryption_key: %w", err)
			}
			s.DatabaseEncryptionKey = value
		case "use_file_database":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_file_database: %w", err)
			}
			s.UseFileDatabase = value
		case "use_chat_info_database":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_chat_info_database: %w", err)
			}
			s.UseChatInfoDatabase = value
		case "use_message_database":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_message_database: %w", err)
			}
			s.UseMessageDatabase = value
		case "use_secret_chats":
			value, err := b.Bool()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field use_secret_chats: %w", err)
			}
			s.UseSecretChats = value
		case "api_id":
			value, err := b.Int32()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field api_id: %w", err)
			}
			s.APIID = value
		case "api_hash":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field api_hash: %w", err)
			}
			s.APIHash = value
		case "system_language_code":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field system_language_code: %w", err)
			}
			s.SystemLanguageCode = value
		case "device_model":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field device_model: %w", err)
			}
			s.DeviceModel = value
		case "system_version":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field system_version: %w", err)
			}
			s.SystemVersion = value
		case "application_version":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode setTdlibParameters#d1c0f62e: field application_version: %w", err)
			}
			s.ApplicationVersion = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetUseTestDC returns value of UseTestDC field.
func (s *SetTdlibParametersRequest) GetUseTestDC() (value bool) {
	if s == nil {
		return
	}
	return s.UseTestDC
}

// GetDatabaseDirectory returns value of DatabaseDirectory field.
func (s *SetTdlibParametersRequest) GetDatabaseDirectory() (value string) {
	if s == nil {
		return
	}
	return s.DatabaseDirectory
}

// GetFilesDirectory returns value of FilesDirectory field.
func (s *SetTdlibParametersRequest) GetFilesDirectory() (value string) {
	if s == nil {
		return
	}
	return s.FilesDirectory
}

// GetDatabaseEncryptionKey returns value of DatabaseEncryptionKey field.
func (s *SetTdlibParametersRequest) GetDatabaseEncryptionKey() (value []byte) {
	if s == nil {
		return
	}
	return s.DatabaseEncryptionKey
}

// GetUseFileDatabase returns value of UseFileDatabase field.
func (s *SetTdlibParametersRequest) GetUseFileDatabase() (value bool) {
	if s == nil {
		return
	}
	return s.UseFileDatabase
}

// GetUseChatInfoDatabase returns value of UseChatInfoDatabase field.
func (s *SetTdlibParametersRequest) GetUseChatInfoDatabase() (value bool) {
	if s == nil {
		return
	}
	return s.UseChatInfoDatabase
}

// GetUseMessageDatabase returns value of UseMessageDatabase field.
func (s *SetTdlibParametersRequest) GetUseMessageDatabase() (value bool) {
	if s == nil {
		return
	}
	return s.UseMessageDatabase
}

// GetUseSecretChats returns value of UseSecretChats field.
func (s *SetTdlibParametersRequest) GetUseSecretChats() (value bool) {
	if s == nil {
		return
	}
	return s.UseSecretChats
}

// GetAPIID returns value of APIID field.
func (s *SetTdlibParametersRequest) GetAPIID() (value int32) {
	if s == nil {
		return
	}
	return s.APIID
}

// GetAPIHash returns value of APIHash field.
func (s *SetTdlibParametersRequest) GetAPIHash() (value string) {
	if s == nil {
		return
	}
	return s.APIHash
}

// GetSystemLanguageCode returns value of SystemLanguageCode field.
func (s *SetTdlibParametersRequest) GetSystemLanguageCode() (value string) {
	if s == nil {
		return
	}
	return s.SystemLanguageCode
}

// GetDeviceModel returns value of DeviceModel field.
func (s *SetTdlibParametersRequest) GetDeviceModel() (value string) {
	if s == nil {
		return
	}
	return s.DeviceModel
}

// GetSystemVersion returns value of SystemVersion field.
func (s *SetTdlibParametersRequest) GetSystemVersion() (value string) {
	if s == nil {
		return
	}
	return s.SystemVersion
}

// GetApplicationVersion returns value of ApplicationVersion field.
func (s *SetTdlibParametersRequest) GetApplicationVersion() (value string) {
	if s == nil {
		return
	}
	return s.ApplicationVersion
}

// SetTdlibParameters invokes method setTdlibParameters#d1c0f62e returning error if any.
func (c *Client) SetTdlibParameters(ctx context.Context, request *SetTdlibParametersRequest) error {
	var ok Ok

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