package app

import (
	"context"
	"fmt"
	"strings"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

// enqueueAppNotificationMutationFanoutInTx persists the post-commit browser
// projection in the shared scope fanout outbox. The mutation receipt id is the
// durable dedupe boundary, so request replay repairs a missing row without
// producing a second stream event.
func (store *Store) enqueueAppNotificationMutationFanoutInTx(ctx context.Context, tx coredb.Tx, mutationID string, result AppNotificationResult, now time.Time) error {
	if result.MessageMutation == nil {
		return nil
	}
	kind := message.ScopeMessageMutationUpdate
	if strings.TrimSpace(result.MessageMutationKind) == "delete" {
		kind = message.ScopeMessageMutationRecall
	}
	payload, err := message.MarshalScopeMessageMutationFanoutPayload(message.ScopeMessageMutationFanoutPayload{
		Kind: kind, Message: *result.MessageMutation,
		UpdateConversation: result.MessageMutationIsLatestVisible,
	})
	if err != nil {
		return fmt.Errorf("marshal App notification mutation fanout: %w", err)
	}
	mutationID = strings.TrimSpace(mutationID)
	if mutationID == "" {
		return fmt.Errorf("App notification mutation fanout receipt id is required")
	}
	if now.IsZero() {
		now = time.Now().UTC()
	} else {
		now = now.UTC()
	}
	outbox, err := message.BuildScopeMessageMutationFanoutOutboxRecord(
		result.WorkspaceID, result.ScopeID, result.MessageID, mutationID,
		"app-notification-mutation:"+mutationID, payload, now, 10,
	)
	if err != nil {
		return err
	}
	return message.NewScopeRepositories(tx).Outbox.Insert(ctx, outbox)
}
