package promptcompiler

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/prompts"
)

func TestPromptCompilerOwnedTemplatesRenderTypedInputs(t *testing.T) {
	cases := []struct {
		name string
		path string
		data any
	}{
		{"active task", templateActiveTask, ActiveTaskTemplateData{TaskNumber: 1, Channel: "#agentteam", CheckpointCommand: "agentteam exec task checkpoint"}},
		{"attachments", templateAttachmentManifest, AttachmentTemplateData{Attachments: []AttachmentTemplateItem{{Number: 1, Label: "a.txt", Path: "/tmp/a.txt"}}}},
		{"attachment failure", templateAttachmentPreparationFailure, AttachmentTemplateData{Error: "offline", Attachments: []AttachmentTemplateItem{{Number: 1, Label: "a.txt"}}}},
		{"compaction", templateContextCompactionContinuation, RecoveryTemplateData{}},
		{"truncation", templateOutputTruncationContinuation, RecoveryTemplateData{}},
		{"delivery reply", templateDeliveryReply, DeliveryReplyTemplateData{Target: "#agentteam", SendCall: "message_send(...)"}},
		{"delivery replay", templateDeliveryReplay, DeliveryReplayTemplateData{Details: "state=replay"}},
		{"final reply", templateFinalVisibleReplyCheck, FinalVisibleReplyCheckTemplateData{Wakes: []FinalVisibleReplyCheckTemplateWake{{Target: "#agentteam", HasTarget: true}}, SendMessageTool: "message_send"}},
		{"message", templateMessageHeader, MessageTemplateData{Target: "#agentteam", MessageID: "msg", Timestamp: "-", Author: "@agent", Content: "hello"}},
		{"delivery header", templateDeliveryHeader, DeliveryHeaderTemplateData{Target: "#agentteam", MessageID: "msg", Timestamp: "-", Author: "@agent", Payload: "hello"}},
		{"recovery checkpoint", templateRecoveryCheckpoint, RecoveryCheckpointTemplateData{Kind: "compact"}},
		{"reply target", templateReplyTargetContext, ReplyTargetTemplateData{Target: "#agentteam", SendCall: "message_send(...)"}},
		{"retry", templateRuntimeRetry, RuntimeRetryTemplateData{Reason: "overloaded", Attempt: 1, MaxAttempts: 3, Delay: "1s"}},
		{"task attributes", templateTaskAttributes, nil},
		{"task reply", templateTaskReply, TaskReplyTemplateData{Tool: "message_send", TaskDiscussion: true}},
		{"task scope reply", templateTaskScopeReply, TaskScopeReplyTemplateData{Tool: "message_send"}},
		{"team", templateTeamContext, TeamPromptTemplateData{Teams: []TeamPromptTemplateContext{{Label: "@team"}}}},
		{"workflow", templateWorkflowContext, WorkflowTemplateData{Trusted: true, RunID: "run", StepID: "step"}},
		{"workflow edit", templateWorkflowAgentEdit, WorkflowEditPromptData{PlanID: "plan", BaseDraftRevision: 1, TargetLabel: "node:n"}},
		{"task dispatch", templateTaskDispatch, TaskPromptTemplateData{Label: "#t1", Discussion: true, ReplyTool: "message_send"}},
		{"task scope context", templateTaskScopeContext, TaskScopeContextTemplateData{Target: "#t1", ReplyInstruction: "reply"}},
		{"reaction", templateReactionDetails, ReactionPromptData{Emoji: "👍"}},
		{"message attachment details", templateAttachmentDetails, AttachmentDetailsTemplateData{Title: "attachments:", Attachments: []MessageAttachmentDetailItem{{Filename: "a.txt", ID: "a"}}}},
		{"thread root", templateThreadRoot, ThreadRootTemplateData{HeaderParts: "msg=root", Author: "@alice", Content: "hello", EarlierReplyCount: 1}},
		{"visible reply contract", templateVisibleReplyContract, VisibleReplyContractTemplateData{SendMessageTool: "message_send"}},
		{"exec guidance", templateExecGuidance, ExecGuidanceTemplateData{Domains: []string{"agent"}, CommonActions: []ExecGuidanceAction{{Domain: "task", Name: "get", ExampleJSON: `{"number":1}`}}}},
		{"extension guidance", templateExtensionGuidance, ExtensionCatalogGuidanceTemplateData{Actions: []ExtensionCatalogGuidanceAction{{ExtensionName: "extension", ActionName: "list"}}}},
		{"workspace document", templateWorkspaceDocument, WorkspaceDocumentTemplateData{Content: "doc"}},
		{"workspace identity", templateWorkspaceIdentity, WorkspaceIdentityTemplateData{Content: "identity"}},
		{"memory reminder", templateMemoryResumeReminder, EmptyTemplateData{}},
		{"unread summary", templateEventUnreadSummary, UnreadSummaryTemplateData{Channels: []UnreadSummaryChannel{{Channel: "#agentteam", Count: 1}, {Channel: "#ops", Count: 2}}}},
		{"workflow team", templateWorkflowTeamContext, WorkflowTeamPromptData{Teams: []WorkflowTeamPromptContext{{Label: "team"}}}},
		{"memory search", templateMemorySearchGuidance, MemorySearchGuidanceTemplateData{SearchTool: "mcp__agentteam__memory_search"}},
		{"external skill core", templateExternalSkillCore, ExternalSkillPayloadTemplateData{SkillText: "external core"}},
		{"external skill reference", templateExternalSkillReference, ExternalSkillPayloadTemplateData{SkillText: "external reference"}},
		{"thread context", templateThreadContext, ThreadContextTemplateData{Enabled: true, Target: "#agentteam:abc123", ReadHistoryTool: "message_history_read"}},
		{"thread context compact", templateThreadContextCompact, ThreadContextTemplateData{Enabled: true, Target: "#agentteam:abc123", ReadHistoryTool: "message_history_read"}},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			text, err := renderPromptTemplateChecked(tc.path, tc.data)
			require.NoError(t, err)
			require.NotEmpty(t, text)
		})
	}
}

func renderPromptTemplateChecked(path string, data any) (string, error) {
	return prompts.Render(path, data)
}
