import type { ToolResult } from '../../types/index.js';
import type { ToolWithMetadata } from '../types.js';
import type { Todo, TodoStatus } from './todo-manager.js';
import { todoManager } from './todo-manager.js';

/**
 * 验证 todo 项
 */
function validateTodo(item: unknown): item is { content: string; status: TodoStatus } {
  if (typeof item !== 'object' || item === null) return false;
  const obj = item as Record<string, unknown>;
  if (typeof obj.content !== 'string' || obj.content.trim() === '') return false;
  if (!['pending', 'in_progress', 'completed'].includes(obj.status as string)) return false;
  return true;
}

export const todoWriteTool: ToolWithMetadata = {
  name: 'todowrite',
  description: `创建和管理当前会话的待办事项列表。用于跟踪进度、组织复杂任务，并向用户展示工作进展。

## 使用场景

主动使用此工具的情况：
1. 复杂多步骤任务 - 任务需要 3 个或更多步骤
2. 非平凡的复杂任务 - 需要仔细规划或多个操作的任务
3. 用户明确要求使用待办列表
4. 用户提供多个任务 - 用户给出编号列表或逗号分隔的任务
5. 收到新指令后 - 立即将用户需求记录为待办
6. 开始处理任务时 - 将其标记为 in_progress
7. 完成任务后 - 标记为 completed 并添加发现的后续任务

## 不使用此工具的情况

跳过使用的情况：
1. 只有单个简单任务
2. 任务太简单，跟踪没有意义
3. 任务可以在 3 个简单步骤内完成
4. 纯粹的对话或信息性请求

## 任务状态

- pending: 待处理，尚未开始
- in_progress: 进行中（同一时间只能有一个）
- completed: 已完成

## 任务管理规则

- 实时更新任务状态
- 完成后立即标记（不要批量标记）
- 同一时间只有一个任务处于 in_progress
- 完成当前任务后再开始新任务`,
  metadata: {
    name: 'todowrite',
    category: 'core',
    description: '创建和更新待办事项列表',
    keywords: ['todo', 'task', 'write', 'update', 'create', '待办', '任务', '创建', '更新'],
    deferLoading: false, // 核心工具，始终加载
  },
  parameters: {
    todos: {
      type: 'array',
      description:
        '更新后的待办事项列表。每个事项包含 content（任务内容）和 status（pending/in_progress/completed）',
      required: true,
    },
  },
  execute: async (params: Record<string, unknown>): Promise<ToolResult> => {
    if (!todoManager.isInitialized()) {
      return {
        success: false,
        output: '',
        error: '会话管理器未初始化，无法更新待办事项',
      };
    }

    const todosInput = params.todos;
    if (!Array.isArray(todosInput)) {
      return {
        success: false,
        output: '',
        error: 'todos 参数必须是数组',
      };
    }

    // 验证并转换输入
    const now = new Date().toISOString();
    const existingTodos = todoManager.getTodos();
    const existingMap = new Map(existingTodos.map((t) => [t.content, t]));

    const newTodos: Todo[] = [];
    for (let i = 0; i < todosInput.length; i++) {
      const item = todosInput[i];
      if (!validateTodo(item)) {
        return {
          success: false,
          output: '',
          error: `第 ${i + 1} 个待办事项格式无效。需要 { content: string, status: 'pending' | 'in_progress' | 'completed' }`,
        };
      }

      // 查找是否已存在（通过内容匹配）
      const existing = existingMap.get(item.content);
      if (existing) {
        // 更新现有项
        newTodos.push({
          ...existing,
          status: item.status,
          updatedAt: now,
        });
      } else {
        // 创建新项
        newTodos.push({
          id: Math.random().toString(36).substring(2, 10),
          content: item.content,
          status: item.status,
          createdAt: now,
          updatedAt: now,
        });
      }
    }

    await todoManager.setTodos(newTodos);

    const pendingCount = newTodos.filter((t) => t.status !== 'completed').length;
    const completedCount = newTodos.filter((t) => t.status === 'completed').length;
    const inProgressCount = newTodos.filter((t) => t.status === 'in_progress').length;

    return {
      success: true,
      output: `待办事项已更新: ${pendingCount} 待处理, ${inProgressCount} 进行中, ${completedCount} 已完成`,
      metadata: {
        todos: newTodos,
        pendingCount,
        inProgressCount,
        completedCount,
      },
    };
  },
};
