// Package downloader contains downloading files helpers.
package downloader

import (
	"go.mau.fi/mautrix-telegram/pkg/gotd/bin"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
)

// Downloader is Telegram file downloader.
type Downloader struct {
	partSize int
	pool     *bin.Pool
}

const defaultPartSize = 512 * 1024 // 512 kb

// NewDownloader creates new Downloader.
func NewDownloader() *Downloader {
	return new(Downloader).WithPartSize(defaultPartSize)
}

// WithPartSize sets chunk size.
// Must be divisible by 4KB.
//
// See https://core.telegram.org/api/files#downloading-files.
func (d *Downloader) WithPartSize(partSize int) *Downloader {
	d.partSize = partSize
	d.pool = bin.NewPool(partSize)
	return d
}

// Download creates Builder for plain downloads.
func (d *Downloader) Download(rpc Client, location tg.InputFileLocationClass) *Builder {
	return newBuilder(d, master{
		client:   rpc,
		precise:  true,
		allowCDN: false,
		location: location,
	})
}

// Web creates Builder for web files downloads.
func (d *Downloader) Web(rpc Client, location tg.InputWebFileLocationClass) *Builder {
	return newBuilder(d, web{
		client:   rpc,
		location: location,
	})
}
