package app

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/require"

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

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

	content := formatServiceEventDeliveryMessage(provider.ProviderEvent{
		Provider:           "github",
		EventKind:          "github_pull_request.issue_comment_created",
		ActionKind:         "created",
		ResourceIdentifier: "github:acme/agentteam#42 @all",
		ResourceURL:        "https://github.example/acme/agentteam/pull/42 @online",
		ActorLogin:         "@provider-bot",
		BodyExcerpt:        "@agent please inspect\nsecond line",
	})

	require.Contains(t, content, "GitHub received a PR comment by provider-bot")
	require.NotContains(t, content, "@all")
	require.NotContains(t, content, "@online")
	require.NotContains(t, content, "@agent")
	require.Contains(t, content, "@\u200ball")
	require.Contains(t, content, "@\u200bonline")
	require.Contains(t, content, "@\u200bagent")
}

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

	content := formatServiceEventDeliveryMessage(provider.ProviderEvent{
		Provider:           "gitea",
		EventKind:          "gitea_pull_request.synchronized",
		ActionKind:         "synchronized",
		ResourceIdentifier: "gitea:pingcap/agentteam#42",
		ActorLogin:         "ci-bot",
		Extra: map[string]string{
			"head_sha": "abcdef1234567890",
		},
	})

	require.Contains(t, content, "Gitea synchronized a PR (commit abcdef1) by ci-bot on gitea:pingcap/agentteam#42")
}

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

	adapter := &serviceEventDeliveryDispatcher{
		event: serviceEventProviderWebhookEvent{
			Event: provider.ProviderEvent{
				Provider:           "gitea",
				EventKind:          "gitea_pull_request.base_branch_pushed",
				ResourceIdentifier: "gitea:acme/agentteam#0",
				ResourceURL:        "",
				Extra: map[string]string{
					"branch": "main",
				},
			},
		},
	}
	candidate := serviceEventDeliveryCandidate{
		Subscription: ServiceEventSubscriptionRecord{
			ResourceKey: "gitea:acme/agentteam#42",
			ResourceRef: "https://gitea.example/acme/agentteam/pulls/42",
			Metadata:    []byte(`{"base_branch":"release-1.0"}`),
		},
	}

	event := adapter.webhookEventForCandidate(candidate)

	require.Equal(t, "gitea:acme/agentteam#42", event.Event.ResourceIdentifier)
	require.Equal(t, "https://gitea.example/acme/agentteam/pulls/42", event.Event.ResourceURL)
	require.Equal(t, "release-1.0", event.Event.Extra["base_branch"])
	require.Equal(t, "main", event.Event.Extra["branch"])
	require.NotSame(t, &adapter.event.Event.Extra, &event.Event.Extra)
	require.Equal(t, map[string]string{"branch": "main"}, adapter.event.Event.Extra)
}

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

	lines := strings.Repeat("line\n", 20)
	content := serviceEventExternalBodyBlockquote(lines)

	require.Contains(t, content, "…")
	require.Len(t, strings.Split(content, "\n"), 13)
}
