package fanout

import (
	"context"
	"fmt"

	messageservice "github.com/tidbcloud/AgentTeam/internal/service/message"
	"github.com/tidbcloud/AgentTeam/internal/store/identity"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

type sentMessageDecorator interface {
	DecorateAppMessageForUser(ctx context.Context, userID string, workspaceID string, appMessage message.AppMessage) (message.AppMessage, error)
}

func SendAndFanoutHumanMessage(ctx context.Context, writer HumanMessageWriter, fanout DeliveryFanout, owner identity.User, workspaceID string, targetRef string, content string, attachmentIDs []string, options messageservice.SendOptions) (message.AppMessage, message.MessageDelivery, error) {
	if writer == nil {
		return message.AppMessage{}, message.MessageDelivery{}, fmt.Errorf("app message service is nil")
	}
	appMessage, delivery, err := writer.SendHumanMessage(ctx, owner, workspaceID, targetRef, content, attachmentIDs, options)
	if err != nil {
		return message.AppMessage{}, message.MessageDelivery{}, err
	}
	if !delivery.IdempotentReplay {
		fanout.EmitCommittedHumanMessage(ctx, workspaceID, appMessage, delivery)
	}
	if decorator, ok := writer.(sentMessageDecorator); ok {
		if decorated, decorateErr := decorator.DecorateAppMessageForUser(ctx, owner.ID, workspaceID, appMessage); decorateErr == nil {
			appMessage = decorated
		}
	}
	return appMessage, delivery, nil
}
