package app

import (
	"testing"

	"github.com/stretchr/testify/require"

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

func TestBuildAppMessageDeliverySummaryPreviewOmitsAgentSelfOnlyNoTargetPreview(t *testing.T) {
	t.Parallel()

	preview := BuildAppMessageDeliverySummaryPreview(
		message.AppMessage{
			ID:            "msg-agent-self",
			AuthorProfile: message.AuthorProfile{ActorType: message.AuthorActorTypeAgent, MemberID: "member-alpha", DisplayName: "alpha-agent"},
			Content:       "thread follow-up",
		},
		"thread",
		[]message.DiagnosticsAgentState{
			{
				AgentID:       "agent-alpha",
				AgentName:     "alpha-agent",
				MemberID:      "member-alpha",
				AgentStatus:   "active",
				AgentActivity: "working",
			},
		},
		nil,
	)

	require.Nil(t, preview)
}

func TestBuildAppMessageDeliverySummaryPreviewExcludesAgentAuthorFromCounts(t *testing.T) {
	t.Parallel()

	preview := BuildAppMessageDeliverySummaryPreview(
		message.AppMessage{
			ID:            "msg-agent-target",
			AuthorProfile: message.AuthorProfile{ActorType: message.AuthorActorTypeAgent, MemberID: "member-alpha", DisplayName: "alpha-agent"},
			Content:       "@beta-agent please take this one",
		},
		"thread",
		[]message.DiagnosticsAgentState{
			{
				AgentID:       "agent-alpha",
				AgentName:     "alpha-agent",
				MemberID:      "member-alpha",
				AgentStatus:   "active",
				AgentActivity: "working",
			},
			{
				AgentID:       "agent-beta",
				AgentName:     "beta-agent",
				MemberID:      "member-beta",
				AgentStatus:   "sleeping",
				AgentActivity: "sleeping",
			},
		},
		[]message.DiagnosticsAgentState{
			{
				AgentID:        "agent-beta",
				AgentName:      "beta-agent",
				MemberID:       "member-beta",
				DeliveryReason: message.AgentDeliveryReasonDirectMention,
			},
		},
	)

	require.NotNil(t, preview)
	require.Equal(t, 1, preview.TargetedAgentCount)
	require.Equal(t, 0, preview.ExcludedAgentCount)
	require.Equal(t, 0, preview.ActiveNowCount)
}

func TestBuildAppMessageDeliverySummaryPreviewKeepsHumanOwnerContextExclusions(t *testing.T) {
	t.Parallel()

	preview := BuildAppMessageDeliverySummaryPreview(
		message.AppMessage{
			ID:            "msg-human-owner-context",
			AuthorProfile: message.AuthorProfile{ActorType: message.AuthorActorTypeHuman, MemberID: "member-human", DisplayName: "Human"},
			Content:       "@alpha-agent owner quote",
		},
		"thread",
		[]message.DiagnosticsAgentState{
			{
				AgentID:       "agent-alpha",
				AgentName:     "alpha-agent",
				MemberID:      "member-alpha",
				AgentStatus:   "sleeping",
				AgentActivity: "sleeping",
			},
		},
		nil,
	)

	require.NotNil(t, preview)
	require.Equal(t, 0, preview.TargetedAgentCount)
	require.Equal(t, 1, preview.ExcludedAgentCount)
}

func TestBuildAppMessageDeliverySummaryPreviewSuppressesHumanOwnerContextMentions(t *testing.T) {
	t.Parallel()

	state := BuildAppMessageDeliverySummaryPreviewState(
		message.AppMessage{
			ID:            "msg-human-owner-context",
			AuthorProfile: message.AuthorProfile{ActorType: message.AuthorActorTypeHuman, MemberID: "member-human", DisplayName: "Human"},
			Content:       "@alpha-agent owner quote",
		},
		"channel",
		[]message.DiagnosticsAgentState{
			{
				AgentID:       "agent-alpha",
				AgentName:     "alpha-agent",
				MemberID:      "member-alpha",
				AgentStatus:   "sleeping",
				AgentActivity: "sleeping",
			},
		},
		nil,
	)

	require.Nil(t, state.Preview)
	require.NotNil(t, state.DiagnosticsEnabled)
	require.False(t, *state.DiagnosticsEnabled)
}

// NOTE: The integration tests from the original app_message_delivery_preview_test.go
// (TestListMessagesForUserIncludesDeliverySummaryPreviewForOwnerChannelMention,
// TestListMessagesForUserIncludesDeliverySummaryPreviewForOwnerThreadInheritedReply,
// TestListMessagesForUserIncludesDeliverySummaryPreviewForOwnerThreadDirectMention,
// TestSendMessageForUserReturnsDeliverySummaryPreviewForOwnerChannelMention,
// TestSendMessageForUserReturnsDeliverySummaryPreviewForOwnerThreadInheritedReply,
// TestSendMessageForUserReturnsDeliverySummaryPreviewForOwnerThreadDirectMention)
// were not ported because they are integration tests that depend on
// setupMessageRoutingFixture and dataStore.App().SendMessageForUser() / ListMessagesForUser(),
// which require the full store stack. These should remain in the root store package.
