"""开发工具 - Phase 6.4"""

from typing import Any

from app.agents.tools.base import ReadTool, WriteTool
from app.agents.tools.manifest import (
    PermissionClass,
    SideEffectScope,
)


class LSPTools(ReadTool):
    """语言服务器协议工具集

    提供代码导航、查找引用等 LSP 功能。
    """

    def __init__(self):
        super().__init__(
            name="lsp_tools",
            description="LSP 代码导航和查找引用",
            permission_class=PermissionClass.READ,
            side_effect_scope=SideEffectScope.NONE,
            tags=["development", "lsp", "code"],
        )

    def get_parameters(self) -> dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "action": {
                    "type": "string",
                    "enum": ["goto_definition", "find_references", "document_symbols"],
                    "description": "LSP 操作类型",
                },
                "file": {
                    "type": "string",
                    "description": "文件路径",
                },
                "line": {
                    "type": "integer",
                    "description": "行号（1-based）",
                },
                "character": {
                    "type": "integer",
                    "description": "列号（0-based）",
                },
            },
            "required": ["action", "file"],
        }

    def get_return_schema(self) -> dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "success": {"type": "boolean"},
                "results": {"type": "array"},
            },
        }

    async def execute(
        self,
        action: str,
        file: str,
        line: int = 1,
        character: int = 0,
    ) -> dict[str, Any]:
        # 注意：实际 LSP 调用需要通过 lsp-utils 或类似库
        # 这里只是一个框架实现
        return {
            "success": False,
            "error": f"LSP action '{action}' not fully implemented - requires LSP server integration",
            "action": action,
            "file": file,
            "position": {"line": line, "character": character},
        }


class GitTool(ReadTool):
    """Git 操作工具

    提供常用的 Git 操作。
    """

    def __init__(self, repo_path: str = "."):
        super().__init__(
            name="git",
            description="执行 Git 命令",
            permission_class=PermissionClass.EXTERNAL,
            side_effect_scope=SideEffectScope.LOCAL_STATE,
            requires_confirmation=True,
            tags=["development", "git", "version-control"],
        )
        self.repo_path = repo_path

    def get_parameters(self) -> dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "command": {
                    "type": "string",
                    "description": "Git 子命令和参数，如 'status' 或 'log --oneline -10'",
                },
                "repo_path": {
                    "type": "string",
                    "description": "仓库路径（可选）",
                },
            },
            "required": ["command"],
        }

    def get_return_schema(self) -> dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "stdout": {"type": "string"},
                "stderr": {"type": "string"},
                "returncode": {"type": "integer"},
            },
        }

    async def execute(self, command: str, repo_path: str | None = None) -> dict[str, Any]:
        import asyncio
        import os
        import platform

        repo = repo_path or self.repo_path

        # 构建完整的 git 命令
        if platform.system() == "Windows":
            full_command = f'git -C "{repo}" {command}'
        else:
            full_command = f"git -C '{repo}' {command}"

        try:
            process = await asyncio.create_subprocess_shell(
                full_command,
                stdout=asyncio.subprocess.PIPE,
                stderr=asyncio.subprocess.PIPE,
            )

            stdout, stderr = await process.communicate()

            return {
                "stdout": stdout.decode("utf-8", errors="replace"),
                "stderr": stderr.decode("utf-8", errors="replace"),
                "returncode": process.returncode,
            }

        except Exception as e:
            return {
                "stdout": "",
                "stderr": str(e),
                "returncode": -1,
            }
