from __future__ import annotations

from .models import LessonStep, StandardAnswer


SKILL_LABELS = {
    "create_new_part": "新建零件",
    "create_front_plane_sketch": "在前视基准面创建草图",
    "create_top_plane_sketch": "在上视基准面创建草图",
    "create_right_plane_sketch": "在右视基准面创建草图",
    "draw_circle_diameter_mm": "绘制圆",
    "draw_line_mm": "绘制直线",
    "extrude_boss_mm": "凸台拉伸",
    "extrude_cut_mm": "切除拉伸",
    "create_revolve_boss_mm": "旋转凸台",
    "create_revolve_cut_mm": "旋转切除",
    "shell_remove_face_at_point_mm": "抽壳",
    "loft_boss_from_profiles": "放样凸台",
    "loft_cut_from_profiles": "放样切除",
    "swept_boss_circular_profile_mm": "扫描凸台",
    "swept_cut_circular_profile_mm": "扫描切除",
    "fillet_edges_radius_mm": "圆角",
    "chamfer_edges_angle_distance_mm": "倒角",
    "hole_wizard_threaded_mm": "异形孔向导",
    "linear_pattern_feature_mm": "线性阵列",
    "circular_pattern_feature": "圆周阵列",
    "mirror_feature_about_plane": "镜像",
}


def build_lesson_steps(standard: StandardAnswer) -> list[LessonStep]:
    result: list[LessonStep] = []
    for index, step in enumerate(standard.steps, 1):
        title = SKILL_LABELS.get(step.skill, step.name or step.skill)
        result.append(
            LessonStep(
                step_id=f"lesson-{index:03d}",
                order=index,
                title=title,
                voice_text=voice_text_for(step.skill, title, step.arguments),
                expected_skill=step.skill,
                expected_arguments=step.arguments,
                source_feature=step.source_feature,
                check_policy={
                    "match": "skill_and_core_arguments",
                    "method_required": True,
                    "geometry_is_secondary": True,
                },
            )
        )
    return result


def voice_text_for(skill: str, title: str, args: dict[str, object]) -> str:
    if skill.endswith("_sketch") or "sketch" in skill:
        return f"请在 SolidWorks 中执行：{title}。注意选择正确的基准面或参考面。"
    if skill == "extrude_boss_mm":
        return f"请点击特征中的凸台拉伸，深度设置为 {args.get('depth_mm', '标准答案要求值')} 毫米。"
    if skill == "extrude_cut_mm":
        return f"请点击特征中的切除拉伸，深度或终止条件按照标准答案设置。不要用抽壳或删除面替代。"
    if skill == "shell_remove_face_at_point_mm":
        return f"请点击特征中的抽壳，壁厚设置为 {args.get('thickness_mm', '标准答案要求值')} 毫米，并选择需要移除的开口面。"
    if "loft" in skill:
        return "请使用放样命令，按标准答案依次选择轮廓草图。不要用拉伸或扫描替代。"
    if "swept" in skill:
        return "请使用扫描命令，选择正确的轮廓和路径。不要用放样或拉伸替代。"
    return f"请在 SolidWorks 中完成：{title}。完成后系统会读取特征树并判断方法与参数是否正确。"

