/**
 * 任务处理模块
 * 
 * 负责处理单个任务，将任务描述发送给Cursor执行代码开发
 */

import { info, error } from './logger.js';

/**
 * 处理任务
 * 
 * 这个函数将任务描述格式化后返回，供Cursor通过MCP协议接收并执行
 * 
 * @param {Object} task - 任务对象
 * @param {number} task.task_id - 任务ID
 * @param {string} task.task_name - 任务名称
 * @param {string} task.task_description - 任务描述（markdown格式）
 * @param {boolean} autoComplete - 是否启用自动完成模式
 * @returns {Promise<Object>} 处理结果
 */
export async function processTask(task, autoComplete = true) {
    info(`[Task Processor] Processing task ${task.task_id}: ${task.task_name} (autoComplete: ${autoComplete})`);
    const startTime = Date.now();
    
    try {
        // 构建任务执行消息
        // 这个消息将通过MCP协议返回给Cursor，Cursor会解析并执行
        const taskMessage = {
            type: 'development_task',
            task_id: task.task_id,
            task_name: task.task_name,
            description: task.task_description,
            timestamp: new Date().toISOString(),
            auto_complete: autoComplete,
        };

        // 格式化任务描述，确保是有效的markdown
        const formattedDescription = formatTaskDescription(task);
        info(`[Task Processor] Task ${task.task_id} description formatted successfully (${formattedDescription.length} characters)`);

        // 从任务描述中提取关键信息
        const extractedInfo = extractTaskInfo(task);

        // 返回任务信息，供Cursor处理
        // Cursor会接收到这个信息，并根据描述执行代码开发
        const result = {
            success: true,
            message: `Task ${task.task_id} prepared for execution`,
            task_id: task.task_id,
            task_name: task.task_name,
            formatted_description: formattedDescription,
            auto_complete: autoComplete,
            // 这些字段将在任务完成后更新到数据库
            code_name: extractedInfo.code_name || null,
            code_path: extractedInfo.code_path || task.code_path || 'app/core/data_flow',
            execution_instructions: autoComplete ? 
                buildAutoCompleteInstructions(task, formattedDescription) :
                buildManualInstructions(task, formattedDescription),
        };
        
        const duration = Date.now() - startTime;
        info(`[Task Processor] Task ${task.task_id} processed successfully in ${duration}ms`);
        
        return result;
    } catch (err) {
        const duration = Date.now() - startTime;
        error(`[Task Processor] Task ${task.task_id} processing failed after ${duration}ms: ${err.message}`);
        return {
            success: false,
            message: `Failed to process task: ${err.message}`,
            error: err.stack,
        };
    }
}

/**
 * 构建自动完成模式的执行指令
 * 
 * @param {Object} task - 任务对象
 * @param {string} formattedDescription - 格式化后的任务描述
 * @returns {string} 执行指令
 */
function buildAutoCompleteInstructions(task, formattedDescription) {
    return `
🤖 自动执行模式 - 任务 ${task.task_id}

## 📋 任务信息
- **任务ID**: ${task.task_id}
- **任务名称**: ${task.task_name}

## 📝 任务描述
${formattedDescription}

## 🚀 自动执行步骤

**请按照以下步骤自动完成任务：**

### 1️⃣ 分析需求
仔细阅读任务描述，理解功能要求和技术细节。

### 2️⃣ 生成代码
根据任务描述，创建 Python 代码文件：
- 确保代码结构清晰、注释完整
- 遵循项目代码规范（PEP 8）
- 包含必要的错误处理和日志记录
- 如果任务描述中指定了文件路径，请使用该路径
- 否则默认保存到 \`app/core/data_flow/\` 目录

### 3️⃣ 自动更新任务状态
**重要！代码生成完成后，必须调用以下 MCP 工具更新任务状态：**

\`\`\`
工具: update_task_status
参数: {
  "task_id": ${task.task_id},
  "status": "completed",
  "code_name": "<生成的代码文件名>.py",
  "code_path": "<代码文件的目录路径>"
}
\`\`\`

### 示例
如果生成了文件 \`app/core/data_flow/data_processor.py\`，则调用：
\`\`\`
{
  "task_id": ${task.task_id},
  "status": "completed",
  "code_name": "data_processor.py",
  "code_path": "app/core/data_flow"
}
\`\`\`

---

**⚠️ 执行提醒**：
- 不要跳过任何步骤
- 必须在生成代码后立即更新任务状态
- 如果遇到问题，将 status 设为 "failed" 并记录原因
`;
}

/**
 * 构建手动模式的执行指令
 * 
 * @param {Object} task - 任务对象
 * @param {string} formattedDescription - 格式化后的任务描述
 * @returns {string} 执行指令
 */
function buildManualInstructions(task, formattedDescription) {
    return `
📋 手动执行模式 - 任务 ${task.task_id}

## 任务信息
- 任务ID: ${task.task_id}
- 任务名称: ${task.task_name}

## 任务描述
${formattedDescription}

## 执行要求
1. 仔细阅读任务描述，理解需求
2. 根据描述开发相应的代码
3. 确保代码符合项目规范
4. 完成后，手动调用 update_task_status 工具更新状态
`;
}

/**
 * 格式化任务描述
 * 
 * @param {Object} task - 任务对象
 * @returns {string} 格式化后的任务描述
 */
function formatTaskDescription(task) {
    let description = task.task_description || '';

    // 确保描述是有效的markdown格式
    // 如果描述不是以markdown格式开头，添加一些基本格式
    if (!description.trim().startsWith('#')) {
        description = `# ${task.task_name}\n\n${description}`;
    }

    return description;
}

/**
 * 验证任务描述格式
 * 
 * @param {string} description - 任务描述
 * @returns {boolean} 是否为有效的markdown格式
 */
export function validateTaskDescription(description) {
    if (!description || typeof description !== 'string') {
        return false;
    }

    // 基本验证：检查是否包含一些内容
    if (description.trim().length === 0) {
        return false;
    }

    return true;
}

/**
 * 提取任务中的关键信息
 * 
 * @param {Object} task - 任务对象
 * @returns {Object} 提取的关键信息
 */
export function extractTaskInfo(task) {
    const description = task.task_description || '';
    
    // 尝试提取代码文件名和路径（如果任务描述中包含）
    const codeNameMatch = description.match(/代码文件名[：:]\s*([^\n]+)/i);
    const codePathMatch = description.match(/代码路径[：:]\s*([^\n]+)/i);

    return {
        code_name: codeNameMatch ? codeNameMatch[1].trim() : null,
        code_path: codePathMatch ? codePathMatch[1].trim() : null,
    };
}

