package app

import (
	"context"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/store/taskboard"
)

// SetTaskChangeSink installs the process-level Task projection callback. The
// server wires this after its live event emitter is constructed; tests may
// instead provide the sink through Options.
func (store *Store) SetTaskChangeSink(sink taskboard.TaskChangeSink) {
	if store == nil {
		return
	}
	store.taskChangeSinkMu.Lock()
	store.taskChangeSink = sink
	store.taskChangeSinkMu.Unlock()
}

func (store *Store) emitTaskScopeMessageUpdated(ctx context.Context, requestContext taskboard.ServiceContext, task taskboard.Task) {
	if store == nil || strings.TrimSpace(task.ID) == "" {
		return
	}
	store.taskChangeSinkMu.RLock()
	sink := store.taskChangeSink
	store.taskChangeSinkMu.RUnlock()
	if sink == nil {
		return
	}
	sink.HandleTaskChange(ctx, taskboard.NewTaskUpdatedEvent(requestContext, task))
}
