"""Pydantic AI agents for paper analysis."""

from pydantic import ValidationError
from pydantic_ai import Agent, AgentRunResult

from .dependencies import AnalysisDeps
from .models import DomainResult, PaperInput, SummaryResult


SYSTEM_PROMPTS = {
    "summary": """你是一位专业的科学文献分析助手。你的任务是阅读论文的标题和摘要，提取关键信息并生成结构化总结。
请严格按照以下 JSON 格式返回结果：
{{
    "main_findings": ["发现1", "发现2", ...],  // 1-5项主要研究发现
    "innovations": ["创新点1", "创新点2", ...],  // 1-3项创新点
    "conclusions": "核心结论的简洁描述"  // 一句话总结核心结论
}}
注意：
1. main_findings 应提取论文最重要的研究发现，每项用一句话清晰描述
2. innovations 应识别论文相对于现有研究的突破和创新之处
3. conclusions 应概括论文的核心结论和意义
4. 所有内容应简洁准确，避免冗余""",
    "domain": """你是一位专业的科学文献领域分类专家。你的任务是判断论文是否属于指定的研究领域，并给出相关性评分。
请严格按照以下 JSON 格式返回结果：
{{
    "relevant_domains": ["领域1", "领域2"],  // 相关的领域列表
    "domain_scores": {{
        "领域1": 0.9,  // 0-1之间的相关性评分
        "领域2": 0.7
    }},
    "primary_domain": "主要领域名称",  // 最相关的领域
    "reasoning": "判定依据的简要说明"  // 解释为什么判定为这些领域
}}
评分标准：
- 0.8-1.0: 核心研究领域，论文主要关注该领域
- 0.5-0.8: 相关领域，论文涉及该领域的方法或应用
- 0.0-0.5: 弱相关或不相关
注意：
1. 只返回评分 >= 0.5 的领域到 relevant_domains
2. primary_domain 必须是 relevant_domains 中评分最高的领域
3. reasoning 应基于标题、摘要中的具体内容""",
}


async def analyze_summary(
    paper: PaperInput,
    deps: AnalysisDeps,
    model: object | None = None,
) -> AgentRunResult[SummaryResult]:
    """Analyze paper summary using Pydantic AI Agent.

    Args:
        paper: Paper input with title and abstract
        deps: Analysis dependencies including config, cache, and semaphore
        model: Optional model override for testing (e.g., TestModel)

    Returns:
        AgentRunResult containing validated SummaryResult and usage info

    Raises:
        ValidationError: If LLM output doesn't match SummaryResult schema
        Exception: For API errors or other failures
    """
    agent_model = model if model is not None else deps.create_model()
    agent = Agent(
        model=agent_model,
        system_prompt=SYSTEM_PROMPTS["summary"],
        deps_type=AnalysisDeps,
        output_type=SummaryResult,
    )

    user_prompt = f"标题: {paper.title}\n摘要: {paper.abstract}\n请按照要求的 JSON 格式返回分析结果。"

    result = await agent.run(user_prompt, deps=deps)
    return result


async def analyze_domain(
    paper: PaperInput,
    domains: list[str],
    deps: AnalysisDeps,
    model: object | None = None,
) -> AgentRunResult[DomainResult]:
    """Analyze paper domain classification using Pydantic AI Agent.

    Args:
        paper: Paper input with title and abstract
        domains: List of candidate domains for classification
        deps: Analysis dependencies including config, cache, and semaphore
        model: Optional model override for testing (e.g., TestModel)

    Returns:
        AgentRunResult containing validated DomainResult and usage info

    Raises:
        ValidationError: If LLM output doesn't match DomainResult schema
        Exception: For API errors or other failures
    """
    agent_model = model if model is not None else deps.create_model()
    agent = Agent(
        model=agent_model,
        system_prompt=SYSTEM_PROMPTS["domain"],
        deps_type=AnalysisDeps,
        output_type=DomainResult,
    )

    domains_str = ", ".join(domains)
    user_prompt = f"标题: {paper.title}\n摘要: {paper.abstract}\n候选领域: {domains_str}\n请按照要求的 JSON 格式返回领域判定结果。"

    result = await agent.run(user_prompt, deps=deps)
    return result


__all__ = ["SYSTEM_PROMPTS", "analyze_domain", "analyze_summary"]
