#!/usr/bin/env python3
"""
AI搜索工具
调用AI搜索回答用户问题，返回多模态参考源、总结答案和追问问题
"""

import requests
import json
import os
import argparse
from datetime import datetime
from typing import Dict, Any
import sys
from pathlib import Path

# 添加项目根目录到路径并导入配置
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
from lib.config import get_data_dir


class AISearch:
    """AI搜索API封装类"""

    BASE_URL = "http://47.84.182.56:8001"
    TOOL_NAME = "ai_search"

    def __init__(self, results_dir: str = None):
        """
        初始化API客户端

        Args:
            results_dir: 结果输出目录，默认为项目根目录下的 data/search 文件夹
        """
        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"

        # 设置结果输出目录
        if results_dir:
            self.results_base_dir = results_dir
        else:
            # 默认从配置读取
            self.results_base_dir = get_data_dir("search")

    def search(self, query: str, timeout: int = 60) -> Dict[str, Any]:
        """
        执行AI搜索

        Args:
            query: 搜索查询内容
            timeout: 请求超时时间（秒），默认60秒（AI搜索可能需要更长时间）

        Returns:
            API响应的JSON数据
            返回数据中：
            - type=source: 参考源（网页、图片等）
            - type=answer: 总结答案
            - type=follow_up: 追问问题

        Raises:
            requests.exceptions.RequestException: 请求失败时抛出异常
        """
        payload = {
            "query": query
        }

        try:
            response = requests.post(
                self.api_url,
                json=payload,
                timeout=timeout,
                headers={"Content-Type": "application/json"}
            )
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            raise

    def save_result(self, query: str, result: Dict[str, Any]) -> str:
        """
        保存结果到文件
        目录结构: results/ai_search/query关键词/时间戳.json

        Args:
            query: 搜索查询内容
            result: API返回的结果

        Returns:
            保存的文件路径
        """
        # 从query中提取简短的关键词作为文件夹名（取前20个字符）
        query_short = query[:20].replace('/', '_').replace('\\', '_')

        # 创建目录结构: results/ai_search/query/
        result_dir = os.path.join(self.results_base_dir, "ai_search", query_short)
        os.makedirs(result_dir, exist_ok=True)

        # 文件名使用时间戳
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"{timestamp}.json"
        filepath = os.path.join(result_dir, filename)

        # 保存结果
        with open(filepath, 'w', encoding='utf-8') as f:
            json.dump(result, f, ensure_ascii=False, indent=2)

        return filepath


def main():
    """示例使用"""
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='AI搜索工具')
    parser.add_argument(
        '--results-dir',
        type=str,
        default=None,
        help='结果输出目录 (默认: 从配置读取，通常为 data/search)'
    )
    parser.add_argument(
        '--query',
        type=str,
        required=True,
        help='搜索查询内容 (必填)'
    )
    args = parser.parse_args()

    # 创建API客户端实例
    client = AISearch(results_dir=args.results_dir)

    # 执行搜索并保存
    try:
        result = client.search(args.query)
        filepath = client.save_result(args.query, result)
        print(f"Output: {filepath}")
    except Exception as e:
        print(f"Error: {e}", file=__import__('sys').stderr)


if __name__ == "__main__":
    main()
