package message

import (
	"testing"

	"github.com/stretchr/testify/require"
)

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

	metadata := BuildPersistedMentionMetadata(
		[]MessageMentionHint{
			{Type: "agent", ID: "agt_allowed", Token: "Billmay-SDR线索洞察"},
			{Type: "agent", ID: "agt_duplicate_token", Token: "Billmay-SDR线索洞察"},
			{Type: "agent", ID: "agt_not_routed", Token: "other"},
			{Type: "human", ID: "usr_1", Token: "human"},
			{Type: "agent", ID: "agt_allowed", Token: "not-in-content"},
		},
		[]AgentRecipient{
			{AgentID: "agt_allowed"},
			{AgentID: "agt_duplicate_token"},
		},
		[]string{"billmay-sdr线索洞察"},
	)

	require.Equal(t, []map[string]any{
		{
			"type":  "agent",
			"id":    "agt_allowed",
			"token": "billmay-sdr线索洞察",
		},
		{
			"type":  "agent",
			"id":    "agt_duplicate_token",
			"token": "billmay-sdr线索洞察",
		},
	}, metadata)
}

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

	metadata := BuildPersistedMentionMetadata(
		[]MessageMentionHint{{
			Type:  "agent",
			ID:    "agt_billmay",
			Token: "billmay-sdr线索洞察",
		}},
		[]AgentRecipient{{
			AgentID: "agt_billmay",
		}},
		[]string{"billmay-sdr线索洞察请给我一个邮件回复内容"},
	)

	require.Equal(t, []map[string]any{{
		"type":  "agent",
		"id":    "agt_billmay",
		"token": "billmay-sdr线索洞察",
	}}, metadata)
}

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

	metadata := BuildPersistedMentionMetadata(
		nil,
		[]AgentRecipient{{
			AgentID:      "agt_billmay",
			MentionToken: "billmay-sdr线索洞察",
		}},
		[]string{"billmay-sdr线索洞察请给我一个邮件回复内容"},
	)

	require.Equal(t, []map[string]any{{
		"type":  "agent",
		"id":    "agt_billmay",
		"token": "billmay-sdr线索洞察",
	}}, metadata)
}

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

	metadata := BuildPersistedMentionMetadataWithTeams(
		[]MessageMentionHint{
			{Type: "team", ID: "team_core", Token: "Core"},
			{Type: "team", ID: "team_other", Token: "other"},
		},
		nil,
		[]PersistedMention{
			{Type: "team", ID: "team_core", Token: "core"},
		},
		[]string{"core"},
	)

	require.Equal(t, []map[string]any{{
		"type":  "team",
		"id":    "team_core",
		"token": "core",
	}}, metadata)
}

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

	metadata := MetadataWithAgentDeliveryInterruptPolicy(map[string]any{
		"ownerQuote": true,
	}, AgentInterruptPolicyCurrentRun)

	require.Equal(t, true, metadata["ownerQuote"])
	require.True(t, MessageHasAgentDeliveryInterruptPolicy(metadata, AgentInterruptPolicyCurrentRun))
	require.Equal(t, map[string]any{
		"interruptPolicy": AgentInterruptPolicyCurrentRun,
		"status":          AgentDeliveryStatusDelivered,
	}, metadata[AgentDeliveryMetadataKey])
}

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

	mentions := ExtractPersistedMentionMetadata(map[string]any{
		MentionMetadataKey: []any{
			map[string]any{"type": "Agent", "id": " agt_1 ", "token": " Helper "},
			map[string]any{"type": "agent", "id": "agt_1", "token": "helper"},
			map[string]any{"type": "team", "id": " team_1 ", "token": " Core "},
			map[string]any{"type": "human", "id": "usr_1", "token": "helper"},
			"bad",
		},
	})

	require.Equal(t, []PersistedMention{
		{Type: "agent", ID: "agt_1", Token: "helper"},
		{Type: "team", ID: "team_1", Token: "core"},
	}, mentions)
}
