package server

import (
	"context"
	"strings"

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

type taskUnreadRuntime interface {
	ApplyScopeInvalidated(event unread.ScopeInvalidated) error
	ApplyScopeInvalidatedWithDeltas(event unread.ScopeInvalidated) ([]unread.UnreadDelta, error)
}

type taskUnreadDeltaSink interface {
	EmitUnreadUpdated(workspaceID string, delta unread.UnreadDelta)
}

type taskUnreadRuntimeBridge struct {
	runtime   taskUnreadRuntime
	deltaSink taskUnreadDeltaSink
}

func newTaskUnreadRuntimeBridge(runtime taskUnreadRuntime, deltaSink taskUnreadDeltaSink) *taskUnreadRuntimeBridge {
	if runtime == nil {
		return nil
	}
	return &taskUnreadRuntimeBridge{runtime: runtime, deltaSink: deltaSink}
}

func (sink *taskUnreadRuntimeBridge) HandleTaskChange(_ context.Context, event taskboard.TaskChangeEvent) {
	if sink == nil || sink.runtime == nil {
		return
	}
	workspaceID := strings.TrimSpace(event.Context.WorkspaceID)
	if workspaceID == "" {
		return
	}
	switch event.EventType {
	case taskboard.TaskChangeCreated:
		for _, task := range event.Tasks {
			sink.suppressDoneTask(workspaceID, task)
		}
	case taskboard.TaskChangeUpdated:
		sink.suppressDoneTask(workspaceID, event.Task)
	}
}

func (sink *taskUnreadRuntimeBridge) suppressDoneTask(workspaceID string, task taskboard.Task) {
	if strings.TrimSpace(task.Status) != string(taskboard.StatusDone) {
		return
	}
	scopeID := strings.TrimSpace(task.TaskScopeID)
	if scopeID == "" {
		return
	}
	deltas, err := sink.runtime.ApplyScopeInvalidatedWithDeltas(unread.ScopeInvalidated{
		WorkspaceID: strings.TrimSpace(workspaceID),
		ScopeID:     scopeID,
		Reason:      "task_done",
	})
	if err != nil {
		return
	}
	sink.emitDeltas(workspaceID, deltas)
}

func (sink *taskUnreadRuntimeBridge) emitDeltas(workspaceID string, deltas []unread.UnreadDelta) {
	if sink == nil || sink.deltaSink == nil || len(deltas) == 0 {
		return
	}
	for _, delta := range deltas {
		sink.deltaSink.EmitUnreadUpdated(workspaceID, delta)
	}
}
