package prompts

import (
	"io/fs"
	"strings"
	"testing"
	"text/template"

	"github.com/stretchr/testify/require"
)

func TestEmbeddedPromptTemplates_ParseAndVersion(t *testing.T) {
	var paths []string
	err := fs.WalkDir(files, ".", func(path string, entry fs.DirEntry, walkErr error) error {
		require.NoError(t, walkErr)
		if entry.IsDir() || !strings.HasSuffix(path, ".md") {
			return nil
		}
		paths = append(paths, path)
		return nil
	})
	require.NoError(t, err)
	require.NotEmpty(t, paths)

	for _, path := range paths {
		raw, readErr := files.ReadFile(path)
		require.NoErrorf(t, readErr, "read prompt template %s", path)
		_, parseErr := template.New(path).Option("missingkey=error").Parse(string(raw))
		require.NoErrorf(t, parseErr, "parse prompt template %s", path)
		require.NotEmptyf(t, Version(path), "version prompt template %s", path)
	}
}

func TestRender_UsesEmbeddedMarkdownTemplate(t *testing.T) {
	rendered, err := Render("platform/identity.md", map[string]string{
		"AgentName":           "reviewer",
		"ChannelDisplayName":  "AgentTeam",
		"PlatformDescription": "AgentTeam is a multi-agent chat platform where humans and agents collaborate through channels, threads, and tasks.",
	})
	require.NoError(t, err)
	require.Equal(t, "You are \"reviewer\", an AI agent in AgentTeam.\nAgentTeam is a multi-agent chat platform where humans and agents collaborate through channels, threads, and tasks.", rendered)
	require.NotEmpty(t, Version("platform/identity.md"))
}

func TestRender_AgentTeamChannelTemplatesUseEmbeddedMarkdownTemplates(t *testing.T) {
	data := map[string]string{
		"AddReactionTool":              "mcp_agentteam_message_reaction_set",
		"ClearReviewContextTool":       "agentteam exec review delete",
		"CreateTasksTool":              "agentteam exec task create",
		"GetReactionsTool":             "mcp_agentteam_message_reaction_list",
		"GetReviewContextTool":         "agentteam exec review list",
		"ListWorkspaceTool":            "agentteam exec workspace list",
		"ListTasksTool":                "agentteam exec task list",
		"SearchTasksTool":              "agentteam exec task list",
		"ReadHistoryTool":              "mcp_agentteam_message_history_read",
		"RemoveReactionTool":           "mcp_agentteam_message_reaction_set",
		"SendMessageTool":              "mcp_agentteam_message_send",
		"SetReviewDirectoryTool":       "agentteam exec review add",
		"SetReviewGitContextTool":      "agentteam exec review add",
		"TaskAddCheckpointTool":        "agentteam exec task checkpoint",
		"TaskGetTool":                  "agentteam exec task get",
		"TaskUpdateTool":               "agentteam exec task update",
		"ScheduledMessageCreateTool":   "agentteam exec scheduled-message create",
		"ScheduledMessageDeleteTool":   "agentteam exec scheduled-message delete",
		"ScheduledMessageGetTool":      "agentteam exec scheduled-message get",
		"ScheduledMessageListTool":     "agentteam exec scheduled-message list",
		"ScheduledMessagePauseTool":    "agentteam exec scheduled-message pause",
		"ScheduledMessageResumeTool":   "agentteam exec scheduled-message resume",
		"ScheduledMessageRunsTool":     "agentteam exec scheduled-message runs",
		"ScheduledMessageUpdateTool":   "agentteam exec scheduled-message update",
		"ScheduledMessageValidateTool": "agentteam exec scheduled-message validate",
		"ViewFileTool":                 "mcp_agentteam_message_attachment_view",
	}

	core, err := Render("wire/core.md", data)
	require.NoError(t, err)
	require.Contains(t, core, "mcp_agentteam_message_send")
	require.Contains(t, core, "at milestones or every 5–10 minutes")
	require.Contains(t, core, "Progress is not completion")
	require.Contains(t, core, "exact target of the current inbound delivery")
	require.Contains(t, core, "Delegated subagents return only to their leader")
	require.Contains(t, core, "current prompt explicitly authorizes communication to one exact target")
	require.Contains(t, core, "Merely naming or inheriting an ambient, historical/recovered, or Owner-DM target is never authorization")
	require.Contains(t, core, "independent of retired execution mechanisms")
	require.Contains(t, core, "local/final text, shell, HTTP, and stdout are not posted to the conversation")
	require.Contains(t, core, "mcp_agentteam_message_reaction_set")
	require.Contains(t, core, "received `👌`, strong agreement `💯`, same here `🙋`, working `⏳`, done `✅`, review passed `👍`")
	require.Contains(t, core, "acknowledgment-only or status-only replies")
	require.Contains(t, core, "Do not reply to another agent's status/completion unless it requests action")
	require.Contains(t, core, "After reporting actual completion, wait")
	require.NotContains(t, core, "agentteam exec task")
	require.NotContains(t, core, "routing_intent")
	require.NotContains(t, core, "queued_messages")
	require.NotContains(t, core, "mcp_agentteam_message_discussion_entry")
	require.NotEmpty(t, Version("wire/core.md"))

	reference, err := Render("wire/reference.md", data)
	require.NoError(t, err)
	require.Contains(t, reference, "tool schemas and parameters exposed by the current runtime")
	require.Contains(t, reference, "are authoritative for message and memory tool names")
	require.Contains(t, reference, "target=TARGET msg=SHORT_ID delivery=DELIVERY_ID")
	require.Contains(t, reference, "#channel:threadid")
	require.Contains(t, reference, "#tsk_...")
	require.Contains(t, reference, `mcp_agentteam_message_history_read(target="EXACT_TARGET", limit=20)`)
	require.Contains(t, reference, "before deciding no action is needed")
	require.Contains(t, reference, "`我看完了。 @alice`, not `我看完了。@alice`")
	require.Contains(t, reference, "only when a human explicitly asks to create/change a durable schedule")
	require.Contains(t, reference, "do not do it now or store today's result")
	require.Contains(t, reference, "natural future request in `template`")
	require.Contains(t, reference, "`startThread=true`")
	require.NotContains(t, reference, "`messageTemplate`")
	require.NotContains(t, reference, "`alsoStartThread")
	require.Contains(t, reference, "attach one self-contained `.html` file")
	require.Contains(t, reference, "环境：<http://localhost:3000>，请查看")
	require.NotContains(t, reference, "mcp_agentteam_message_discussion_entry")
	require.NotEmpty(t, Version("wire/reference.md"))
}

func TestRender_IdentityNoticeTemplateUsesEmbeddedMarkdownTemplate(t *testing.T) {
	rendered, err := Render("notices/identity_notice.md", map[string]string{
		"CurrentName": "reviewer",
		"OldName":     "planner",
	})
	require.NoError(t, err)
	require.Contains(t, rendered, "`reviewer`")
	require.Contains(t, rendered, "`planner`")
	require.NotEmpty(t, Version("notices/identity_notice.md"))
}
