package promptcompiler

import "strings"

// ContextRecoveryRestartDetail returns compiler-owned context recovery detail.
func ContextRecoveryRestartDetail() string {
	input := newRecoveryPromptInput(RecoveryTemplateData{})
	return renderRegisteredPromptText("event.context_recovery_restart", input)
}

// OpenCodeSubtaskSummaryPrompt returns the registered OpenCode subtask
// continuation wording.
// KimiRestrictedSystemPrompt returns the registered restricted-agent system
// prompt used when native tools are disabled.
func KimiRestrictedSystemPrompt() string {
	input := newRuntimePolicyPromptInput(KimiRestrictedSystemTemplateData{})
	return renderRegisteredPromptText("runtime.kimi_restricted_system", input)
}

func OpenCodeSubtaskSummaryPrompt() string {
	input := newRecoveryPromptInput(RecoveryTemplateData{})
	return renderRegisteredPromptText("runtime.opencode_subtask_summary", input)
}

// ContextCompactionContinuationPrompt returns the compiler-owned continuation
// wording used after same-session context compaction.
func ContextCompactionContinuationPrompt() string {
	input := newRecoveryPromptInput(RecoveryTemplateData{})
	return renderRegisteredPromptText("agentteam.context_compaction_continuation", input)
}

// OutputTruncationContinuationPrompt returns the compiler-owned continuation
// wording used after a runtime output-token limit.
func OutputTruncationContinuationPrompt() string {
	input := newRecoveryPromptInput(RecoveryTemplateData{})
	return renderRegisteredPromptText("agentteam.output_truncation_continuation", input)
}

// RecoveryCheckpoint returns compiler-owned lifecycle checkpoint wording.
func RecoveryCheckpoint(kind string) string {
	data := RecoveryCheckpointTemplateData{Kind: strings.TrimSpace(kind)}
	input := newRecoveryCheckpointPromptInput(data)
	return renderRegisteredPromptText("event.recovery_checkpoint", input)
}

// RuntimeRetryDetail returns compiler-owned transient retry wording.
func RuntimeRetryDetail(httpStatus int, reason string, attempt int, maxAttempts int, delay string) string {
	return renderRegisteredPromptText("event.runtime_retry", newRuntimeRetryPromptInput(RuntimeRetryTemplateData{
		HTTPStatus: httpStatus, Reason: strings.TrimSpace(reason), Attempt: attempt, MaxAttempts: maxAttempts, Delay: strings.TrimSpace(delay),
	}))
}

// FinalVisibleReplyCheckPrompt renders the final-visible-reply safety check from
// typed wake target groups. The target lines are data; all semantic wording is
// owned by the template.
func FinalVisibleReplyCheckWakes(targets []FinalVisibleReplyTarget) []FinalVisibleReplyCheckTemplateWake {
	wakes := make([]FinalVisibleReplyCheckTemplateWake, 0, len(targets))
	for _, target := range targets {
		messageID := strings.TrimSpace(target.MessageID)
		name := strings.TrimSpace(target.Target)
		wakes = append(wakes, FinalVisibleReplyCheckTemplateWake{
			Target: name, MessageID: messageID, HasTarget: name != "",
			IncludeMessageID: name != "" && !target.HasTargetKey && target.Count == 1 && messageID != "",
		})
	}
	return wakes
}

func FinalVisibleReplyCheckPrompt(targets []FinalVisibleReplyTarget, sendMessageTool string) string {
	return renderRegisteredPromptText("agentteam.final_visible_reply_check", newFinalReplyCheckPromptInput(FinalVisibleReplyCheckTemplateData{
		Wakes: FinalVisibleReplyCheckWakes(targets), SendMessageTool: strings.TrimSpace(sendMessageTool),
	}))
}
