package fanout

import (
	"testing"

	"github.com/stretchr/testify/require"

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

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

	writer := &capturingRecallStreamWriter{}
	appMessage := message.AppMessage{
		ID:          "msg_task_fanout_mention",
		Seq:         8,
		ChannelID:   "tsk_scope",
		ChannelType: message.ConversationKindTask,
		Content:     "@mem_reader please review",
		AuthorProfile: message.AuthorProfile{
			ActorType:   message.AuthorActorTypeHuman,
			PrincipalID: "usr_author",
			MemberID:    "mem_author",
			DisplayName: "Author",
		},
		TaskContext: &message.AppMessageTaskContext{
			ChannelID:  "chn_board",
			TaskNumber: 42,
		},
	}
	delivery := message.MessageDelivery{
		MessageID: "msg_task_fanout_mention",
		MentionedHumans: []message.HumanMentionRecipient{{
			UserID:   "usr_reader",
			MemberID: "mem_reader",
		}},
	}

	require.NoError(t, publishMessageCreatedEvent(t.Context(), writer, "wsp_1", "tsk_scope", appMessage, delivery))
	require.Len(t, writer.requests, 1)
	payload := writer.requests[0].Event.Payload
	projected, ok := payload["message"].(dto.AppMessage)
	require.True(t, ok)
	require.Equal(t, &dto.AppMessageTaskContext{ChannelID: "chn_board", TaskNumber: 42}, projected.TaskContext)
	mention, ok := payload["mention"].(map[string]any)
	require.True(t, ok)
	require.Equal(t, map[string]any{"channelId": "chn_board", "taskNumber": int64(42)}, mention["taskContext"])
}

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

	writer := &capturingRecallStreamWriter{}
	notification := &message.HumanReactionNotification{
		ReactionID:  "rxn_task_fanout",
		MessageID:   "msg_task_fanout",
		ChannelID:   "tsk_scope",
		ChannelType: "task",
		TaskContext: &message.AppMessageTaskContext{
			ChannelID:  "chn_board",
			TaskNumber: 42,
		},
		AuthorProfile: message.AuthorProfile{
			ActorType:   message.AuthorActorTypeHuman,
			PrincipalID: "usr_reactor",
			MemberID:    "mem_reactor",
			DisplayName: "Reactor",
		},
		Emoji: "👍",
	}

	require.NoError(t, publishReactionChangedEvent(t.Context(), writer, "wsp_1", "tsk_scope", "msg_task_fanout", nil, notification))
	require.Len(t, writer.requests, 1)
	reaction, ok := writer.requests[0].Event.Payload["reaction"].(map[string]any)
	require.True(t, ok)
	require.Equal(t, map[string]any{"channelId": "chn_board", "taskNumber": int64(42)}, reaction["taskContext"])
}
