package agent

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

func TestFormatStdinDeliveredMessageIncludesExactTarget(t *testing.T) {
	message := types.InboxMessage{
		MessageID:  "00000014fdde160dc7325109eed9bf54",
		Target:     "#agentteam:00000014",
		SenderName: "vwjokl4",
		Content:    "@agentteam1-claude please fix this thread bug",
		Timestamp:  "2026-04-08T02:40:02+08:00",
	}

	formatted := formatStdinDeliveredMessage("", message)
	require.Contains(t, formatted, "target=#agentteam:00000014")
	require.Contains(t, formatted, "msg=00000014")
	require.Contains(t, formatted, "@vwjokl4: @agentteam1-claude please fix this thread bug")
}

func TestFormatStdinDeliveredMessageUsesWorkflowPresentationAuthor(t *testing.T) {
	message := types.InboxMessage{
		MessageID: "msg-workflow-callback",
		Target:    "#agentteam",
		AuthorProfile: types.AuthorProfile{
			ActorType:   "human",
			PrincipalID: "usr_owner",
			DisplayName: "Arithmetic E2E Owner",
		},
		Source: types.ContributionSource{
			Kind:    "workflow_run",
			RefType: "workflow_run",
			RefID:   "wfr_calculator",
			RunID:   "wfr_calculator",
			EventID: "wrf_calculator_effect",
			Label:   "Parallel calculator",
		},
		Content: "Compute the next work item.",
	}

	formatted := formatStdinDeliveredMessage("", message)
	require.Contains(t, formatted, "@Parallel calculator: Compute the next work item.")
	require.NotContains(t, formatted, "Arithmetic E2E Owner")
}

func TestFormatStdinDeliveredMessageIncludesAttachmentDetails(t *testing.T) {
	message := types.InboxMessage{
		MessageID:       "msg-attachment-only",
		Target:          "#agentteam:00000014",
		SenderName:      "alice",
		Timestamp:       "2026-04-20T12:00:00Z",
		AttachmentIDs:   "att-1,att-2",
		AttachmentNames: "deploy.log,trace.json",
	}

	formatted := formatStdinDeliveredMessage("", message)
	require.Contains(t, formatted, "target=#agentteam:00000014")
	require.Contains(t, formatted, "@alice:")
	require.Contains(t, formatted, "attachments:")
	require.Contains(t, formatted, "- deploy.log (id:att-1)")
	require.Contains(t, formatted, "- trace.json (id:att-2)")
}

func TestFormatStdinDeliveredMessageIncludesTaskDiscussionDetails(t *testing.T) {
	message := types.InboxMessage{
		MessageID:   "tsk-1",
		Target:      "#agentteam",
		SenderType:  "human",
		SenderName:  "wink",
		Content:     "Task discussion update for #t1",
		Timestamp:   "2026-04-22T14:53:57Z",
		MessageType: "task_dispatch",
		Metadata: map[string]any{
			"task": map[string]any{
				"taskId":             "tsk_1",
				"taskNumber":         1,
				"channelRef":         "#agentteam",
				"title":              "输出 markdown 制品",
				"status":             "in_progress",
				"priority":           "high",
				"description":        "把结论输出成可下载的 markdown artifact。",
				"acceptanceCriteria": []any{"包含摘要和证据链接"},
				"reviewChecklist":    []any{"确认制品已挂到 task artifact"},
				"workspaceRefs":      []any{"reports/summary.md"},
			},
			"taskDiscussion": map[string]any{
				"entryId": "tds_1",
				"taskId":  "tsk_1",
				"body":    "@test1 你能不能输出的结论变成 markdown 的制品？",
				"createdBy": map[string]any{
					"type": "human",
					"id":   "usr_wink",
					"name": "wink",
				},
			},
		},
	}

	formatted := formatStdinDeliveredMessage("", message)
	require.Contains(t, formatted, `task discussion: #t1 "输出 markdown 制品"`)
	require.Contains(t, formatted, "status: in_progress")
	require.Contains(t, formatted, "priority: high")
	require.Contains(t, formatted, "description:\n把结论输出成可下载的 markdown artifact。")
	require.Contains(t, formatted, "acceptanceCriteria:\n- 包含摘要和证据链接")
	require.Contains(t, formatted, "reviewChecklist:\n- 确认制品已挂到 task artifact")
	require.Contains(t, formatted, "workspaceRefs:\n- reports/summary.md")
	require.Contains(t, formatted, "instruction: Treat these structured task attributes as requirements.")
	require.Contains(t, formatted, "comment by @wink:\n@test1 你能不能输出的结论变成 markdown 的制品？")
}

func TestFormatStdinDeliveredMessageIncludesTaskDispatchAttributesWithoutDiscussion(t *testing.T) {
	message := types.InboxMessage{
		MessageID:   "tsk-2",
		Target:      "#agentteam",
		SenderType:  "human",
		SenderName:  "wink",
		Content:     "Started #t2 填写任务 SPEC",
		Timestamp:   "2026-04-22T14:53:57Z",
		MessageType: "task_dispatch",
		Metadata: map[string]any{
			"task": map[string]any{
				"taskId":     "tsk_2",
				"taskNumber": 2,
				"channelRef": "#agentteam",
				"title":      "填写任务 SPEC",
				"status":     "in_progress",
				"kind":       "feature",
				"priority":   "high",
				"assigneeProfile": map[string]any{
					"actorType":   "agent",
					"principalId": "agent-1",
					"targetId":    "test1",
					"displayName": "Test One",
				},
				"suggestedToYou":     true,
				"reviewer":           map[string]any{"name": "legacy-reviewer"},
				"description":        "先补齐结构化任务属性。",
				"acceptanceCriteria": []any{"非 discussion task wake 展示属性"},
				"reviewChecklist":    []any{"不默认读取完整 discussion"},
			},
		},
	}

	formatted := formatStdinDeliveredMessage("", message)
	require.Contains(t, formatted, `task dispatch: #t2 "填写任务 SPEC"`)
	require.Contains(t, formatted, "status: in_progress")
	require.Contains(t, formatted, "kind: feature")
	require.Contains(t, formatted, "priority: high")
	require.Contains(t, formatted, "assignee: @test1")
	require.NotContains(t, formatted, "suggestedToYou")
	require.NotContains(t, formatted, "legacy-reviewer")
	require.NotContains(t, formatted, "reviewer:")
	require.Contains(t, formatted, "description:\n先补齐结构化任务属性。")
	require.Contains(t, formatted, "acceptanceCriteria:\n- 非 discussion task wake 展示属性")
	require.Contains(t, formatted, "reviewChecklist:\n- 不默认读取完整 discussion")
	require.Contains(t, formatted, "instruction: Treat these structured task attributes as requirements.")
	require.NotContains(t, formatted, "comment by @")
	require.NotContains(t, formatted, "reply: use add_discussion_entry")
}
