"""
Think 工具 - 深度推理工具

让Agent进行深度思考和推理，用于：
- 分析复杂情况
- 规划下一步行动
- 评估发现的严重性
- 决定是否需要创建子Agent
"""

import logging
from typing import Optional
from pydantic import BaseModel, Field

from .base import AgentTool, ToolResult

logger = logging.getLogger(__name__)


class ThinkInput(BaseModel):
    """Think工具输入参数"""
    thought: str = Field(
        ...,
        description="思考内容，可以是分析、规划、评估等"
    )
    category: Optional[str] = Field(
        default="general",
        description="思考类别: analysis(分析), planning(规划), evaluation(评估), decision(决策)"
    )


class ThinkTool(AgentTool):
    """
    Think 工具
    
    这是一个让Agent进行深度推理的工具。Agent可以用它来：
    - 分析复杂情况：当面对复杂的代码逻辑或不确定的漏洞线索时
    - 规划下一步行动：在执行具体操作之前先规划策略
    - 评估发现的严重性：发现可疑点后评估其真实性和影响
    - 决定是否需要分解任务：当任务变得复杂时分析是否需要创建子Agent
    
    Think工具的输出会被记录到Agent的对话历史中，帮助LLM保持思路的连贯性。
    """
    
    @property
    def name(self) -> str:
        return "think"
    
    @property
    def description(self) -> str:
        return """深度思考工具。用于：
1. 分析复杂的代码逻辑或安全问题
2. 规划下一步的分析策略
3. 评估发现的漏洞是否真实存在
4. 决定是否需要深入调查某个方向

使用此工具记录你的推理过程，这有助于保持分析的连贯性。

参数:
- thought: 你的思考内容
- category: 思考类别 (analysis/planning/evaluation/decision)"""
    
    @property
    def args_schema(self):
        return ThinkInput
    
    async def _execute(
        self,
        thought: str,
        category: str = "general",
        **kwargs
    ) -> ToolResult:
        """
        执行思考
        
        实际上这个工具不执行任何操作，只是记录思考内容。
        但它的存在让Agent有一个"思考"的动作，有助于推理。
        """
        if not thought or not thought.strip():
            return ToolResult(
                success=False,
                error="思考内容不能为空",
            )
        
        thought = thought.strip()
        
        # 根据类别添加标记
        category_labels = {
            "analysis": "🔍 分析",
            "planning": "📋 规划",
            "evaluation": "⚖️ 评估",
            "decision": "🎯 决策",
            "general": "💭 思考",
        }
        
        label = category_labels.get(category, "💭 思考")
        
        logger.debug(f"Think tool called: [{label}] {thought[:100]}...")
        
        return ToolResult(
            success=True,
            data={
                "message": f"思考已记录 ({len(thought)} 字符)",
                "category": category,
                "label": label,
            },
            metadata={
                "thought": thought,
                "category": category,
                "char_count": len(thought),
            }
        )


class ReflectTool(AgentTool):
    """
    反思工具
    
    让Agent回顾和总结当前的分析进展
    """
    
    @property
    def name(self) -> str:
        return "reflect"
    
    @property
    def description(self) -> str:
        return """反思工具。用于回顾当前的分析进展：
1. 总结已经发现的问题
2. 评估当前分析的覆盖度
3. 识别可能遗漏的方向
4. 决定是否需要调整策略

参数:
- summary: 当前进展总结
- findings_so_far: 目前发现的问题数量
- coverage: 分析覆盖度评估 (low/medium/high)
- next_steps: 建议的下一步行动"""
    
    @property
    def args_schema(self):
        return None
    
    async def _execute(
        self,
        summary: str = "",
        findings_so_far: int = 0,
        coverage: str = "medium",
        next_steps: str = "",
        **kwargs
    ) -> ToolResult:
        """执行反思"""
        reflection = {
            "summary": summary,
            "findings_count": findings_so_far,
            "coverage": coverage,
            "next_steps": next_steps,
        }
        
        return ToolResult(
            success=True,
            data={
                "message": "反思已记录",
                "reflection": reflection,
            },
            metadata=reflection,
        )
