import { isPlanModeInterviewPhaseEnabled } from '../../utils/planModeV2.js'
import { ASK_USER_QUESTION_TOOL_NAME } from '../AskUserQuestionTool/prompt.js'

const WHAT_HAPPENS_SECTION = `## 在计划模式下会发生什么

在计划模式下，您将：
1. 使用 Glob、Grep 和 Read 工具彻底探索代码库
2. 了解现有模式和架构
3. 设计实施方法
4. 向用户展示您的计划以获得批准
5. 如需澄清方法，请使用 ${ASK_USER_QUESTION_TOOL_NAME}
6. 准备好实施时，使用 ExitPlanMode 退出计划模式

`

function getEnterPlanModeToolPromptExternal(): string {
  // 当访谈阶段启用时，忽略"会发生什么"部分 —
  // 详细的工作流程说明通过 plan_mode 附件（messages.ts）到达。
  const whatHappens = isPlanModeInterviewPhaseEnabled()
    ? ''
    : WHAT_HAPPENS_SECTION

  return `当您即将开始非平凡的实现任务时，请主动使用此工具。在编写代码之前获得用户对您的方法的认可可以防止工作浪费，并确保对齐。此工具将您切换到计划模式，您可以在其中探索代码库并设计实施方法以供用户批准。

## 何时使用此工具

**对于实现任务，除非它们很简单，否则优先使用 EnterPlanMode**。在以下任何条件适用时使用：

1. **新功能实现**：添加有意义的新功能
   - 示例："添加注销按钮" - 它应该放在哪里？点击时会发生什么？
   - 示例："添加表单验证" - 什么规则？什么错误消息？

2. **多种有效方法**：任务可以通过几种不同的方式解决
   - 示例："为 API 添加缓存" - 可以使用 Redis、内存、基于文件等
   - 示例："优化性能" - 许多优化策略是可能的

3. **代码修改**：更改影响现有行为或结构
   - 示例："更新登录流程" - 具体应该改变什么？
   - 示例："重构此组件" - 目标架构是什么？

4. **架构决策**：任务需要在模式或技术之间进行选择
   - 示例："添加实时更新" - WebSockets vs SSE vs 轮询
   - 示例："实现状态管理" - Redux vs Context vs 自定义解决方案

5. **多文件更改**：任务可能涉及超过 2-3 个文件
   - 示例："重构身份验证系统"
   - 示例："添加带有测试的新 API 端点"

6. **需求不明确**：您需要在理解完整范围之前进行探索
   - 示例："让应用更快" - 需要分析和识别瓶颈
   - 示例："修复结账中的 bug" - 需要调查根本原因

7. **用户偏好重要**：实施可能有多种合理的方式
   - 如果您会使用 ${ASK_USER_QUESTION_TOOL_NAME} 来澄清方法，请改用 EnterPlanMode
   - 计划模式让您先探索，然后带着上下文呈现选项

## 何时不使用此工具

仅为简单任务跳过 EnterPlanMode：
- 单行或几行修复（拼写错误、明显的 bug、小调整）
- 添加具有明确需求的单个函数
- 用户给出了非常具体、详细指令的任务
- 纯研究/探索任务（改用带有探索代理的 Agent 工具）

${whatHappens}## 示例

### 好的 - 使用 EnterPlanMode：
用户："为应用添加用户身份验证"
- 需要架构决策（会话 vs JWT、令牌存储位置、中间件结构）

用户："优化数据库查询"
- 多种方法可能，需要先分析，重大影响

用户："实现深色模式"
- 主题系统的架构决策，影响许多组件

用户："在用户配置文件中添加删除按钮"
- 看似简单但涉及：放在哪里、确认对话框、API 调用、错误处理、状态更新

用户："更新 API 中的错误处理"
- 影响多个文件，用户应该批准该方法

### 不好 - 不使用 EnterPlanMode：
用户："修复 README 中的拼写错误"
- 简单直接，不需要计划

用户："添加 console.log 来调试此函数"
- 简单明显的实现

用户："哪些文件处理路由？"
- 研究任务，不是实施计划

## 重要说明

- 此工具需要用户批准 - 他们必须同意进入计划模式
- 如果不确定是否使用它倾向于计划 — 预先达成一致比返工更好
- 用户欣赏在对其代码库进行重大更改之前咨询他们
`
}

function getEnterPlanModeToolPromptAnt(): string {
  // 当访谈阶段启用时，忽略"会发生什么"部分 —
  // 详细的工作流程说明通过 plan_mode 附件（messages.ts）到达。
  const whatHappens = isPlanModeInterviewPhaseEnabled()
    ? ''
    : WHAT_HAPPENS_SECTION

  return `当任务的正确方法存在真正的模糊性且在编码前获取用户输入可以防止重大返工时，使用此工具。此工具将您切换到计划模式，您可以在其中探索代码库并设计实施方法以供用户批准。

## 何时使用此工具

当实施方法真正不明确时，计划模式很有价值。在以下情况下使用：

1. **重大架构模糊性**：存在多种合理方法且选择对代码库有重要意义
   - 示例："为 API 添加缓存" - Redis vs 内存 vs 基于文件
   - 示例："添加实时更新" - WebSockets vs SSE vs 轮询

2. **需求不明确**：您需要探索和澄清才能取得进展
   - 示例："让应用更快" - 需要分析和识别瓶颈
   - 示例："重构此模块" - 需要理解目标架构应该是什么

3. **高影响重构**：任务将显著重构现有代码，首先获得认同可以降低风险
   - 示例："重新设计身份验证系统"
   - 示例："从一种状态管理方法迁移到另一种"

## 何时不使用此工具

当您可以合理地推断出正确方法时，跳过计划模式：
- 任务即使涉及多个文件也很直接
- 用户的请求足够具体，实施路径很清晰
- 您正在添加具有明显实施模式的功能（例如，添加按钮、遵循现有约定的新端点）
- 修复一旦理解 bug 就很清楚的 bug
- 研究/探索任务（改用 Agent 工具）
- 用户说类似"我们能处理 X吗"或"让我们做 X"的话 — 直接开始

如有疑问，优先开始工作并使用 ${ASK_USER_QUESTION_TOOL_NAME} 提出具体问题，而不是进入完整的计划阶段。

${whatHappens}## 示例

### 好的 - 使用 EnterPlanMode：
用户："为应用添加用户身份验证"
- 真正模糊：会话 vs JWT、令牌存储位置、中间件结构

用户："重新设计数据管道"
- 重大重构，错误的方法会浪费大量精力

### 不好 - 不使用 EnterPlanMode：
用户："在用户配置文件中添加删除按钮"
- 实施路径清晰；直接做

用户："我们能处理搜索功能吗？"
- 用户想开始，不是计划

用户："更新 API 中的错误处理"
- 开始工作；如需要提出具体问题

用户："修复 README 中的拼写错误"
- 简单直接，不需要计划

## 重要说明

- 此工具需要用户批准 - 他们必须同意进入计划模式
`
}

export function getEnterPlanModeToolPrompt(): string {
  return process.env.USER_TYPE === 'ant'
    ? getEnterPlanModeToolPromptAnt()
    : getEnterPlanModeToolPromptExternal()
}
