# prompts.py
"""
Prompt 模板库

为 explain / diagnose / suggest 提供结构化 prompt 模板。
"""
from __future__ import annotations

from dataclasses import dataclass


@dataclass
class PromptTemplate:
    """Prompt 模板，包含系统提示和用户提示格式。"""
    system: str
    user_template: str


# ------------------------------------------------------------------ #
# explain 模板
# ------------------------------------------------------------------ #

EXPLAIN_SYSTEM = """你是一位资深的有限元分析（FEA）工程师，擅长解读 CalculiX 仿真结果。
请基于以下仿真统计数据，用简洁专业的语言总结分析结果。
语言：中文（技术术语可保留英文缩写）。

输出要求：
1. 摘要（3-5句话）：整体性能评价
2. 关键发现（3-5条）：最重要的位移/应力结果
3. 位移摘要：最大值、位置、是否合理
4. 应力摘要：最大值、位置、是否超过材料极限
5. 警告（如有）：需要关注的潜在问题

请客观、专业地分析，不要虚构数据。"""


def make_explain_prompt(
    node_count: int,
    element_count: int,
    max_displacement: float,
    max_displacement_node: int,
    max_stress: float,
    max_stress_element: int,
    stress_component: str,
    material_yield: float,
    model_bounds: tuple[float, float, float],
) -> str:
    """生成解释结果的 prompt。"""
    bx, by, bz = model_bounds
    model_size = max(bx, by, bz)

    return f"""## 仿真结果数据

### 网格信息
- 节点数：{node_count}
- 单元数：{element_count}

### 位移结果
- 最大位移：{max_displacement:.6e}（节点 {max_displacement_node}）
- 模型特征尺寸：{model_size:.6e}
- 最大位移/模型尺寸比：{max_displacement/model_size:.4%}

### 应力结果
- 最大{stress_component}应力：{max_stress:.6e}（单元 {max_stress_element}）
- 材料屈服强度（假设）：{material_yield:.6e}
- 应力/屈服比：{max_stress/material_yield:.4f}

请解读以上数据，给出结构性能评价。"""


# ------------------------------------------------------------------ #
# diagnose 模板
# ------------------------------------------------------------------ #

DIAGNOSE_SYSTEM = """你是一位资深的 FEA 工程师，擅长诊断仿真中的错误和警告。

请基于以下诊断结果，帮助用户：
1. 理解问题的根本原因
2. 给出具体的修复建议

语言：中文
输出格式：
- 问题描述（简明）
- 可能原因
- 修复建议（具体可操作）

请直接回答，不要泛泛而谈。"""


def make_diagnose_prompt(
    rule_issues: list[dict],
    stderr_summary: str,
) -> str:
    """生成诊断的 prompt。"""
    issues_text = "\n".join(
        f"- [{i['severity']}] {i['category']}: {i['message']}"
        for i in rule_issues
    ) if rule_issues else "无明显规则违规。"

    return f"""## 诊断摘要

### 规则检测结果
{issues_text}

### 求解器输出摘要（最后50行）
```
{stderr_summary[-2000:]}
```

请分析以上信息，诊断可能的问题。"""


# ------------------------------------------------------------------ #
# suggest 模板
# ------------------------------------------------------------------ #

SUGGEST_SYSTEM = """你是一位资深 FEA 优化工程师，擅长给出结构优化建议。

请基于以下诊断信息，按优先级给出 3-5 条优化建议。
每条建议包含：
- 类别（material / mesh / boundary / geometry）
- 优先级（1=最高，5=最低）
- 标题
- 描述
- 预期改进效果
- 实现难度（easy / medium / hard）

语言：中文
输出格式：JSON 数组

示例：
[
  {{"category": "mesh", "priority": 1, "title": "加密应力集中区域网格",
    "description": "...", "expected_improvement": "应力精度提升 20%",
    "implementation_difficulty": "medium"}}
]"""


def make_suggest_prompt(
    rule_issues: list[dict],
    ai_diagnosis: str,
    max_stress: float,
    max_displacement: float,
    material_yield: float,
) -> str:
    """生成优化建议的 prompt。"""
    issues_text = "\n".join(
        f"- [{i['severity']}] {i['category']}: {i['message']}"
        for i in rule_issues
    ) if rule_issues else "无明显规则违规。"

    stress_ratio = max_stress / material_yield if material_yield > 0 else 0

    return f"""## 当前状态摘要

### 关键指标
- 最大位移：{max_displacement:.6e}
- 最大应力：{max_stress:.6e}
- 应力/屈服比：{stress_ratio:.2f}

### 发现的问题
{issues_text}

### AI 诊断结果
{ai_diagnosis or "（无 AI 诊断）"}

请给出优化建议，专注于提升结构性能和可靠性。"""


# ------------------------------------------------------------------ #
# CAD 生成模板
# ------------------------------------------------------------------ #

CAD_SYSTEM = """你是一位 CadQuery 专家，擅长生成参数化几何代码。

请生成 CadQuery Python 代码，创建以下几何部件：
- 梁（Beam）：指定长度、宽度、高度、圆角半径
- 圆柱（Cylinder）：指定半径、高度、角度
- 板（Plate）：指定长度、宽度、厚度

要求：
1. 使用 CadQuery 2.x API
2. 导出函数 create_<type>(params) -> Workplane
3. 支持 export_step() 和 export_inp() 导出
4. 代码可直接运行

输出格式：纯 Python 代码块，不要解释。"""
