use crate::agent::{SystemPrompt, SystemPromptContext, SystemPromptProvider};

pub struct TodoPromptProvider;

impl TodoPromptProvider {
    pub fn new() -> Self {
        Self
    }
}

impl SystemPromptProvider for TodoPromptProvider {
    fn build(&self, _context: &SystemPromptContext) -> Option<SystemPrompt> {
        Some(SystemPrompt {
            content: TODO_WRITE_INSTRUCTIONS.to_string(),
            context: Some("todo_write".to_string()),
        })
    }
}

const TODO_WRITE_INSTRUCTIONS: &str = r#"
## TodoWrite 工具

你可以使用 `todo_write` 工具在对话中维护结构化的任务列表。

### 何时使用
- 当任务有 3 个或以上明确步骤时，应该使用 todo_write 追踪进度
- 不需要为简单的单步操作（如回答一个问题、读取一个文件）创建 todo

### merge 参数
- `merge: false`（默认）：全量替换 — 只传入需要追踪的 todo，不在列表中的项将被移除
- `merge: true`（推荐）：增量更新 — 只传入需要添加或更新的项，未提及的项保持不变。**绝大多数情况应该使用 merge=true**

### 状态语义
- `pending` — 尚未开始
- `in_progress` — 当前正在执行（同一时间只能有一个）
- `completed` — 已完成
- `cancelled` — 不再需要

### 核心规则
1. 同一时间只能有一个任务处于 `in_progress` 状态
2. 必须先完成当前 `in_progress` 的任务，再开始下一个
3. `completed` 和 `cancelled` 的项可以重新激活（改回 `in_progress` 或 `pending`），用于任务返工或恢复
4. `in_progress` 不能退回 `pending`，应直接标记为 `completed` 或 `cancelled`
5. 不要先标记 completed 再去实际执行 — 先完成工作，再标记
6. `content` 字段保持简洁、可执行
7. **每个任务都必须传 `id`**。新任务由你生成一个短随机字符串作为 id（如 `"r9Tg8Kq2"`），更新任务时使用相同的 id。id 可以从之前 todo_write 返回的 `current_todos` 中获取

### 使用范例

创建新任务（生成随机 id）：
```json
{"merge": true, "todos": [{"id": "aB3kLm9x", "content": "修复登录 bug", "status": "in_progress"}]}
```

追加新任务：
```json
{"merge": true, "todos": [{"id": "pQ7nWy2z", "content": "补充测试", "status": "pending"}]}
```

更新已有任务（使用创建时的 id）：
```json
{"merge": true, "todos": [{"id": "aB3kLm9x", "content": "修复登录 bug", "status": "completed"}]}
```

同时更新多项：
```json
{"merge": true, "todos": [
  {"id": "aB3kLm9x", "content": "修复登录 bug", "status": "completed"},
  {"id": "pQ7nWy2z", "content": "补充测试", "status": "in_progress"}
]}
```
"#;
