package telegram

import (
	"context"
)

// handleSingleMessages handle single messages not belongs to group.
func (b *Bot) handleSingleMessages(ctx context.Context, messages []Message) error {
	var attachments []Attachment

	for _, message := range messages {
		attachment, err := b.downloadAttachment(ctx, &message)
		if err != nil {
			return err
		}
		if attachment != nil {
			attachments = append(attachments, *attachment)
		}

		err = b.handler.MessageHandle(ctx, b, message, attachments)
		if err != nil {
			return err
		}
	}

	return nil
}

// handleGroupMessages handle a message belongs to group.
func (b *Bot) handleGroupMessages(ctx context.Context, groupMessages []Message) error {
	captions := make(map[string]string, len(groupMessages))
	messages := make(map[string]Message, len(groupMessages))
	attachments := make(map[string][]Attachment, len(groupMessages))

	// Group all captions, blobs and messages.
	for _, message := range groupMessages {
		groupID := *message.MediaGroupID

		messages[groupID] = message

		if message.Caption != nil {
			captions[groupID] += *message.Caption
		}

		attachment, err := b.downloadAttachment(ctx, &message)
		if err != nil {
			return err
		}

		if attachment != nil {
			attachments[groupID] = append(attachments[groupID], *attachment)
		}
	}

	// Handle each group message.
	for groupID, message := range messages {
		// replace Caption with all Caption in the group.
		caption := captions[groupID]
		message.Caption = &caption
		err := b.handler.MessageHandle(ctx, b, message, attachments[groupID])
		if err != nil {
			return err
		}
	}

	return nil
}
