package mcp

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/messagesend"
	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
	"github.com/tidbcloud/AgentTeam/desktop/internal/wire/apiclient"
)

func TestAgentTeamConnectionPortContainsOnlyRemoteConnectionOperations(t *testing.T) {
	var _ AgentTeamConnection = serviceTestAgentTeamConnection{}
}

func TestNewMessageHandlerRejectsMissingRequiredDependency(t *testing.T) {
	service := NewMessageService()
	runtime := serviceTestMessageRuntime{}
	connection := serviceTestAgentTeamConnection{id: "server-a"}
	complete := MessageHandlerConfig{Connection: connection, Runtime: runtime}

	for _, test := range []struct {
		name    string
		service *MessageService
		config  MessageHandlerConfig
	}{
		{name: "service", config: complete},
		{
			name:    "connection",
			service: service,
			config:  MessageHandlerConfig{Runtime: runtime},
		},
		{
			name:    "runtime",
			service: service,
			config:  MessageHandlerConfig{Connection: connection},
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			_, err := NewMessageHandler(test.service, test.config)
			require.Error(t, err)
		})
	}
}

type serviceTestAgentTeamConnection struct{ id string }

func (c serviceTestAgentTeamConnection) ID() string { return c.id }
func (serviceTestAgentTeamConnection) APIClient(...string) *apiclient.Client {
	return &apiclient.Client{}
}
func (serviceTestAgentTeamConnection) Send(context.Context, types.Metadata, types.OutboundMessage) error {
	return nil
}

type serviceTestMessageRuntime struct{}

func (serviceTestMessageRuntime) Session(string) (types.SessionSnapshot, bool) {
	return types.SessionSnapshot{}, true
}
func (serviceTestMessageRuntime) PrepareVisibleReply(string, ...string) string     { return "" }
func (serviceTestMessageRuntime) ConfirmReactionReply(string, string, string) bool { return true }
func (serviceTestMessageRuntime) ReconcileInboxMessages(string, []string) error    { return nil }
func (serviceTestMessageRuntime) ReconcileRuntimeAckedDeliveries(string, []string) ([]string, error) {
	return nil, nil
}
func (serviceTestMessageRuntime) ReconcileDeferredDeliveriesForAgent(string, []string) ([]string, error) {
	return nil, nil
}
func (serviceTestMessageRuntime) PrepareRuntimeMessageToolDeliveries(string, []types.InboxMessage) int {
	return 0
}
func (serviceTestMessageRuntime) AcknowledgeRuntimeMessageToolDeliveriesForSession(string, []string, types.MCPToolDeliveryOutcome, string) {
}
func (serviceTestMessageRuntime) InboxMessagesForFreshnessPage(string, string, int64, int) (types.InboxReadPage, error) {
	return types.InboxReadPage{}, nil
}
func (serviceTestMessageRuntime) InboxMessagesForFreshnessPageForRuntime(string, string, int64, int, string) (types.InboxReadPage, error) {
	return types.InboxReadPage{}, nil
}
func (serviceTestMessageRuntime) PendingRuntimeInputCoversFreshness(string, string, int64) bool {
	return false
}
func (serviceTestMessageRuntime) MessageFreshnessSnapshot(string, string) (types.MessageFreshnessFrontier, bool) {
	return types.MessageFreshnessFrontier{}, false
}
func (serviceTestMessageRuntime) RememberMessageFreshnessObserved(string, []types.InboxMessage) bool {
	return false
}
func (serviceTestMessageRuntime) RememberMessageFreshnessHeld(string, string, int64, int64) bool {
	return false
}
func (serviceTestMessageRuntime) SetActiveTaskTarget(string, types.ActiveTaskTarget) bool {
	return false
}

func (serviceTestMessageRuntime) SendScope(context.Context, string) (messagesend.Scope, bool) {
	return messagesend.Scope{}, true
}
