"""联网搜索工具（通过 DuckDuckGo，无需额外 API Key）。"""

import asyncio
import json
from typing import Any

SEARCH_TIMEOUT = 12

WEB_SEARCH_TOOL: dict[str, Any] = {
    "type": "function",
    "function": {
        "name": "web_search",
        "description": (
            "搜索互联网获取最新、实时的信息。"
            "当用户询问新闻、天气、股价、价格、事件进展、"
            "或任何可能随时间变化的内容时，必须调用此工具。"
        ),
        "parameters": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "搜索关键词，尽量简洁准确",
                }
            },
            "required": ["query"],
        },
    },
}


def _search_sync(query: str, max_results: int = 5) -> str:
    try:
        from ddgs import DDGS

        ddgs = DDGS()
        results = list(ddgs.text(query, max_results=max_results))
        if not results:
            results = list(ddgs.text(query, max_results=max_results, region="cn-zh"))
        if not results:
            return f"未找到与「{query}」相关的搜索结果，请换个关键词试试。"
        lines = []
        for i, item in enumerate(results, 1):
            title = item.get("title", "")
            href = item.get("href", "") or item.get("link", "")
            body = item.get("body", "") or item.get("snippet", "")
            lines.append(f"[{i}] {title}\n链接: {href}\n摘要: {body}")
        return "\n\n".join(lines)
    except Exception as exc:
        return f"搜索失败: {exc}"


async def web_search(query: str, max_results: int = 5) -> str:
    try:
        return await asyncio.wait_for(
            asyncio.to_thread(_search_sync, query, max_results),
            timeout=SEARCH_TIMEOUT,
        )
    except TimeoutError:
        return f"搜索超时（{SEARCH_TIMEOUT}秒），请稍后重试或关闭联网搜索。"


async def execute_tool(name: str, arguments: str) -> str:
    if name != "web_search":
        return f"未知工具: {name}"
    try:
        args = json.loads(arguments or "{}")
    except json.JSONDecodeError:
        return "工具参数格式错误"
    query = (args.get("query") or "").strip()
    if not query:
        return "搜索关键词不能为空"
    return await web_search(query)


def get_tools() -> list[dict[str, Any]]:
    return [WEB_SEARCH_TOOL]
