package downloader

import (
	"context"
	"io"

	"github.com/go-faster/errors"

	"go.mau.fi/mautrix-telegram/pkg/gotd/tdsync"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
)

func (d *Downloader) stream(ctx context.Context, r *reader, w io.Writer) (tg.StorageFileTypeClass, error) {
	var typ tg.StorageFileTypeClass

	g := tdsync.NewCancellableGroup(ctx)
	toWrite := make(chan block, 1)

	stop := func(t tg.StorageFileTypeClass) {
		typ = t
		close(toWrite)
	}
	// Download loop
	g.Go(func(ctx context.Context) error {
		for {
			b, err := r.Next(ctx)
			if err != nil {
				return errors.Wrap(err, "get file")
			}

			n := len(b.data)
			if n < 1 {
				stop(b.tag)
				return nil
			}

			select {
			case <-ctx.Done():
				return ctx.Err()
			case toWrite <- b:
			}

			if b.last() {
				stop(b.tag)
				return nil
			}
		}
	})

	// Write loop
	g.Go(writeLoop(w, toWrite))

	return typ, g.Wait()
}
