package promptcompiler

import (
	"strings"

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

const (
	promptTaskDescriptionMaxRunes = 1200
	promptTaskChecklistMaxItems   = 8
	promptTaskChecklistItemRunes  = 300
)

// IsTaskDiscussionDispatch reports whether msg carries a task discussion dispatch payload.
func IsTaskDiscussionDispatch(msg types.InboxMessage) bool {
	return isTaskDiscussionDispatch(msg)
}

func isTaskDiscussionDispatch(msg types.InboxMessage) bool {
	if strings.TrimSpace(msg.MessageType) != "task_dispatch" || len(msg.Metadata) == 0 {
		return false
	}
	_, ok := decodeTaskPromptMetadata(strings.TrimSpace(msg.MessageType), msg.Metadata)
	return ok && metadataHasTaskDiscussion(msg.Metadata)
}

func isTaskScopeDiscussionMessage(msg types.InboxMessage) bool {
	return strings.TrimSpace(msg.MessageType) == "task_discussion"
}

func taskScopeDiscussionSendMessageTool(discussionReplyTool string) string {
	trimmed := strings.TrimSpace(discussionReplyTool)
	if trimmed == "" {
		return "message_send"
	}
	return trimmed
}

func formatTaskScopeDiscussionPromptDetails(target string, msg types.InboxMessage, discussionReplyTool string) string {
	if !isTaskScopeDiscussionMessage(msg) {
		return ""
	}
	target = strings.TrimSpace(target)
	if target == "" {
		target = inferredTarget(msg)
	}
	if target == "" {
		return ""
	}

	sendMessageTool := taskScopeDiscussionSendMessageTool(discussionReplyTool)
	replyInstruction := renderRegisteredPromptText("event.task_scope_reply", newTaskScopeReplyPromptInput(TaskScopeReplyTemplateData{Tool: sendMessageTool, TaskScopeCall: formatMessageSendCall(sendMessageTool, target)}))
	return renderRegisteredPromptText("event.task_scope_context", newTaskScopeContextPromptInput(TaskScopeContextTemplateData{Target: target, ReplyInstruction: replyInstruction}))
}

func formatTaskDispatchPromptMetadata(metadata TaskPromptMetadata, discussionReplyTool string) string {
	task := metadata.Task
	data := TaskPromptTemplateData{
		Discussion: metadata.Discussion != nil, TaskNumber: task.TaskNumber, HasTaskNumber: task.HasTaskNumber, Title: task.Title,
		ChannelRef: task.ChannelRef, ReplyTool: taskScopeDiscussionSendMessageTool(discussionReplyTool),
		Details: TaskPromptDetailsTemplateData{Status: task.Status, Kind: task.Kind, Priority: task.Priority, BlockedReason: task.BlockedReason, Assignee: task.Assignee, Description: task.Description,
			AcceptanceCriteria: task.AcceptanceCriteria, ReviewChecklist: task.ReviewChecklist, PinnedMessageRefs: task.PinnedMessageRefs, RelevantURLs: task.RelevantURLs, WorkspaceRefs: task.WorkspaceRefs},
	}
	if metadata.Discussion != nil {
		data.CommentBy = metadata.Discussion.Actor
		data.CommentBody = metadata.Discussion.Body
	}
	return renderRegisteredPromptText("event.task_dispatch", newTaskTemplatePromptInput(data))
}

func metadataHasTaskDiscussion(metadata map[string]any) bool {
	_, ok := metadata["taskDiscussion"].(map[string]any)
	return ok
}
