// Code generated by cmd/genapi. DO NOT EDIT.

//go:build !ignore_autogenerated

package api

import (
	"context"
	"github.com/goccy/go-json"
	"strconv"

	"github.com/lukaszraczylo/go-telegram/client"
)

var _ = strconv.Itoa // keep import for multipart helpers
var _ = json.Marshal // keep import for complex multipart fields

// GetMeParams is the parameter set for GetMe.
//
// A simple method for testing your bot's authentication token. Requires no parameters. Returns basic information about the bot in form of a User object.
type GetMeParams struct {
}

// GetMe calls the getMe Telegram Bot API method.
//
// A simple method for testing your bot's authentication token. Requires no parameters. Returns basic information about the bot in form of a User object.
func GetMe(ctx context.Context, b *client.Bot, p *GetMeParams) (*User, error) {
	return client.Call[*GetMeParams, *User](ctx, b, "getMe", p)
}

// SendMessageParams is the parameter set for SendMessage.
//
// Use this method to send text messages. On success, the sent Message is returned.
type SendMessageParams struct {
	// Unique identifier for the target chat.
	ChatID ChatID `json:"chat_id"`
	// Text of the message to be sent.
	Text string `json:"text"`
	// Mode for parsing entities in the message text.
	ParseMode ParseMode `json:"parse_mode,omitempty"`
}

// SendMessage calls the sendMessage Telegram Bot API method.
//
// Use this method to send text messages. On success, the sent Message is returned.
func SendMessage(ctx context.Context, b *client.Bot, p *SendMessageParams) (*Message, error) {
	return client.Call[*SendMessageParams, *Message](ctx, b, "sendMessage", p)
}

// SendDocumentParams is the parameter set for SendDocument.
//
// Use this method to send general files. On success, the sent Message is returned.
type SendDocumentParams struct {
	// Unique identifier for the target chat.
	ChatID int64 `json:"chat_id"`
	// File to send.
	Document *InputFile `json:"document"`
	// Document caption.
	Caption string `json:"caption,omitempty"`
}

// HasFile reports whether a multipart upload is required.
func (p *SendDocumentParams) HasFile() bool {
	if p.Document != nil && p.Document.IsLocalUpload() {
		return true
	}
	return false
}

// MultipartFields returns the non-file fields used in the multipart body.
func (p *SendDocumentParams) MultipartFields() map[string]string {
	out := map[string]string{}
	out["chat_id"] = strconv.FormatInt(p.ChatID, 10)
	if p.Caption != "" {
		out["caption"] = p.Caption
	}
	return out
}

// MultipartFiles returns the file parts.
func (p *SendDocumentParams) MultipartFiles() []client.MultipartFile {
	var files []client.MultipartFile
	if p.Document != nil && p.Document.IsLocalUpload() {
		name := p.Document.Filename
		if name == "" {
			name = "document"
		}
		files = append(files, client.MultipartFile{FieldName: "document", Filename: name, Reader: p.Document.Reader})
	}
	return files
}

// SendDocument calls the sendDocument Telegram Bot API method.
//
// Use this method to send general files. On success, the sent Message is returned.
func SendDocument(ctx context.Context, b *client.Bot, p *SendDocumentParams) (*Message, error) {
	return client.Call[*SendDocumentParams, *Message](ctx, b, "sendDocument", p)
}

// GetUpdatesParams is the parameter set for GetUpdates.
//
// Use this method to receive incoming updates using long polling. Returns an Array of Update objects.
type GetUpdatesParams struct {
	// Limits the number of updates to be retrieved.
	Limit *int64 `json:"limit,omitempty"`
}

// GetUpdates calls the getUpdates Telegram Bot API method.
//
// Use this method to receive incoming updates using long polling. Returns an Array of Update objects.
func GetUpdates(ctx context.Context, b *client.Bot, p *GetUpdatesParams) ([]Update, error) {
	return client.Call[*GetUpdatesParams, []Update](ctx, b, "getUpdates", p)
}
