package api

import (
	"strings"

	"github.com/tidbcloud/AgentTeam/desktop/internal/api/mcp"
	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

func newAgentTeamMCPHandler(message types.MCPHandler, memoryService mcp.MemorySearcher) (types.MCPHandler, error) {
	return mcp.NewAgentTeamHandler(message, memoryService, nil)
}

func newAgentTeamMCPHandlerForRoute(
	service *mcp.MessageService,
	chMgr types.ServerConnectionAccessor,
	sessions interface {
		mcp.MessageRuntime
		mcp.KBRouteContext
	},
	memory mcp.MemorySearcher,
	serverID string,
) (types.MCPHandler, bool) {
	if service == nil || sessions == nil {
		return nil, false
	}
	ch, ok := chMgr.ServerConnection(strings.TrimSpace(serverID))
	if !ok {
		return nil, false
	}
	connection, ok := ch.(mcp.AgentTeamConnection)
	if !ok {
		return nil, false
	}
	// The narrow message-send scope port is required in production: fail the
	// factory instead of building a handler whose target guard silently
	// allows everything.
	provider, ok := sessions.(mcp.SendScopeProvider)
	if !ok {
		return nil, false
	}
	messageHandler, err := mcp.NewMessageHandler(service, mcp.MessageHandlerConfig{
		Connection:        connection,
		Runtime:           sessions,
		SendScopeProvider: provider,
	})
	if err != nil {
		return nil, false
	}
	kbHandler, err := mcp.NewKBHandler(mcp.KBHandlerConfig{Connection: connection, Runtime: sessions})
	if err != nil {
		return nil, false
	}
	handler, err := mcp.NewAgentTeamHandler(
		messageHandler,
		memory,
		kbHandler,
	)
	if err != nil {
		return nil, false
	}
	return handler, true
}
