package app

import (
	"encoding/json"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/core/routing"
)

func TestAppMentionEventPayloadUsesAppIdentityRoot(t *testing.T) {
	payload, err := marshalAppMentionEventPayload(appMentionEventPayloadParams{
		WorkspaceID: "ws_1",
		Candidate: appMentionSubscriptionCandidate{
			ServiceDefinitionID:      "app_1",
			ServiceInstallationID:    "appinst_1",
			ServiceMemberID:          "svcmem_1",
			ServiceMemberMemberID:    "mem_1",
			ServiceMemberHandle:      "reviewer",
			ServiceMemberDisplayName: "Reviewer",
			DefinitionSlug:           "reviewer",
			AppName:                  "Reviewer",
		},
		Target: ServiceEventTarget{
			TargetKind:             "channel",
			TargetRef:              "channel_1",
			DeliveryScopeID:        "scope_1",
			PermissionCheckScopeID: "scope_1",
		},
		SourceMessageID: "msg_1",
		MessageType:     "m.text",
		Content:         "@reviewer please review",
		RoutingContent:  "@reviewer please review",
		Author: appMentionAuthorSnapshot{
			Type:        "human",
			MemberID:    "mem_author",
			DisplayName: "Author",
		},
		MentionSpans: []routing.DirectMentionSpan{{
			Type:  "service",
			Token: "reviewer",
			ID:    "mem_1",
			Start: 0,
			End:   9,
		}},
		CreatedAt: time.Date(2026, time.August, 6, 1, 2, 3, 0, time.UTC),
	})
	require.NoError(t, err)

	root := decodeAppPayloadRoot(t, payload)
	require.Contains(t, root, "app")
	require.NotContains(t, root, "runtime")
	require.NotContains(t, root, "bot")
}

func TestAppNotificationActionPayloadUsesAppIdentityRoot(t *testing.T) {
	payload, err := appNotificationActionEnvelope(
		AppNotificationRecord{
			ID:                    "notification_1",
			ServiceDefinitionID:   "app_1",
			ServiceInstallationID: "appinst_1",
			ServiceMemberID:       "svcmem_1",
			MessageID:             "msg_1",
			ScopeID:               "scope_1",
			Revision:              2,
		},
		AppNotificationCardRecord{CardRevision: 3},
		"invocation_1",
		AppNotificationActionCommand{
			ActionKey:      "approve",
			Input:          map[string]any{"comment": "ok"},
			ClientActionID: "client_action_1",
			CorrelationID:  "correlation_1",
		},
		appNotificationHumanActorProfile{
			MemberID:    "mem_actor",
			UserID:      "user_1",
			DisplayName: "Actor",
		},
	)
	require.NoError(t, err)

	root := decodeAppPayloadRoot(t, payload)
	require.Contains(t, root, "app")
	require.NotContains(t, root, "runtime")
	require.NotContains(t, root, "bot")
}

func decodeAppPayloadRoot(t *testing.T, payload []byte) map[string]json.RawMessage {
	t.Helper()
	var root map[string]json.RawMessage
	require.NoError(t, json.Unmarshal(payload, &root))
	return root
}
