# -*- coding: utf-8 -*-
"""CM AiAnalysisCommands AI 分析命令族（Phase 8 Tier 2）

借鉴 zhikuncode AiAnalysisCommands.java（70 行）：
- /bug-hunter (别名 /bughunt) — 智能扫描项目潜在 Bug
- /pr-review (别名 /review-pr) — 审查 Git diff 或指定 PR
- /security-scan (别名 /sec-scan) — 扫描安全漏洞
- /explain — 解释代码片段或概念

实现模式：复用 _inject_methodology 模式，每条命令生成结构化 prompt 注入 session。
集成点：main.py handle_slash_command 注册 4 条命令 + 3 个别名。
"""

# Bug Hunter Prompt：扫描项目潜在 Bug
BUG_HUNTER_PROMPT = """# Bug Hunter 模式

你现在是 Bug Hunter 模式。请扫描项目代码，识别以下类型的潜在 Bug：

## 扫描维度

1. **空指针 / None 引用**：未检查的 None 访问、未初始化变量
2. **资源泄漏**：未关闭的文件/连接/锁、未释放的内存
3. **并发问题**：竞态条件、死锁、可见性问题、未同步的共享状态
4. **边界条件**：数组越界、整数溢出、空集合操作
5. **异常处理**：吞异常、过宽的 except、未传播的关键错误
6. **逻辑错误**：错误的条件判断、死代码、不可达分支
7. **类型错误**：运行时类型不匹配、隐式类型转换陷阱
8. **资源管理**：忘记释放、双重释放、错误的清理顺序

## 输出格式

对每个发现的 Bug：
- **位置**：文件路径 + 行号
- **类型**：上述 8 类之一
- **严重性**：Critical / High / Medium / Low
- **描述**：问题简述
- **建议**：修复方案

## 严格规则

- 仅报告真实存在的 Bug，不臆测
- 优先级 Critical > High > Medium > Low
- 同一问题只报告一次（取最严重等级）
- 对每个建议给出最小改动方案

---
"""

# PR Review Prompt：审查 Git diff 或指定 PR
PR_REVIEW_PROMPT = """# PR Review 模式

你现在是 PR Review 模式。请按以下维度审查代码变更：

## 评审维度

1. **正确性**：逻辑是否正确？是否处理所有边界？
2. **可读性**：命名是否清晰？结构是否直观？是否需要注释？
3. **代码规范**：是否符合项目既有风格？
4. **安全性**：是否引入安全漏洞（注入/越权/敏感信息泄漏）？
5. **性能**：是否有不必要的开销？算法复杂度合理？
6. **测试覆盖**：是否需要新增/修改测试？
7. **可维护性**：是否过度抽象？是否符合 YAGNI？
8. **依赖**：是否引入不必要依赖？是否破坏向后兼容？

## 输出格式

对每个变更文件：
- **文件**：路径
- **评级**：Approve / Request Changes / Block
- **问题**：按维度列出（如有）
- **建议**：具体修改建议（含代码示例）

## 严格规则

- 区分"必须修改"和"建议修改"
- 不强推个人偏好（如命名风格遵循项目既有）
- 对好评也要明确指出（不只是挑刺）

---
"""

# Security Scan Prompt：扫描安全漏洞（OWASP Top 10）
SECURITY_SCAN_PROMPT = """# Security Scan 模式

你现在是 Security Scan 模式。请按 OWASP Top 10 类别扫描项目安全漏洞：

## OWASP Top 10 扫描类别

1. **A01 - Broken Access Control**：越权访问、垂直/水平权限漏洞
2. **A02 - Cryptographic Failures**：弱加密、硬编码密钥、不安全的随机数
3. **A03 - Injection**：SQL 注入、Command 注入、LDAP 注入、XPath 注入
4. **A04 - Insecure Design**：缺失速率限制、未保护的关键路径
5. **A05 - Security Misconfiguration**：默认配置、详细错误信息、不必要的特性开启
6. **A06 - Vulnerable and Outdated Components**：依赖中的已知 CVE
7. **A07 - Identification and Authentication Failures**：弱密码、会话固定、缺失 MFA
8. **A08 - Software and Data Integrity Failures**：未签名更新、反序列化漏洞
9. **A09 - Security Logging and Monitoring Failures**：缺失审计日志、未监控关键事件
10. **A10 - Server-Side Request Forgery (SSRF)**：未校验的 URL 请求、内网访问

## 额外检查

- 硬编码密码 / API Key / Token
- 路径穿越（../）
- XSS（反射型/存储型/DOM 型）
- CSRF Token 缺失
- 不安全的反序列化
- 敏感信息日志泄漏

## 输出格式

对每个发现的漏洞：
- **位置**：文件路径 + 行号
- **OWASP 类别**：上述 10 类之一
- **严重性**：Critical / High / Medium / Low
- **PoC**：可复现的攻击向量（如适用）
- **修复建议**：具体代码修改方案

## 严格规则

- 仅报告真实漏洞，不臆测
- 优先报告 Critical 和 High
- 对每个建议给出最小改动方案
- 区分"已验证"和"疑似"

---
"""

# Explain Prompt：解释代码或概念
EXPLAIN_PROMPT = """# Explain 模式

你现在是 Explain 模式。请按以下要求解释用户指定的代码或概念：

## 解释维度

1. **是什么**：一句话总结目标代码/概念的作用
2. **怎么做**：执行流程、关键步骤、数据流向
3. **为什么**：设计动机、对比替代方案的优劣
4. **关键点**：易错点、边界条件、性能考量
5. **示例**：最小可运行示例（如适用）
6. **延伸**：相关概念、官方文档链接、进一步学习方向

## 严格规则

- 用通俗易懂的语言，避免堆砌术语
- 必要时画 ASCII 流程图或时序图
- 标注关键代码行（用 `// ← 关键` 注释）
- 不臆测，基于代码实际行为解释

---
"""

# 命令注册表：cmd -> prompt
AI_ANALYSIS_COMMANDS = {
    "/bug-hunter": BUG_HUNTER_PROMPT,
    "/pr-review": PR_REVIEW_PROMPT,
    "/security-scan": SECURITY_SCAN_PROMPT,
    "/explain": EXPLAIN_PROMPT,
}

# 别名表：alias -> canonical
ALIASES = {
    "/bughunt": "/bug-hunter",
    "/review-pr": "/pr-review",
    "/sec-scan": "/security-scan",
}


def handle_ai_analysis(cmd: str, user_desc: str, session, working_dir: str) -> str:
    """AI 分析命令处理：注入结构化 prompt 到 session。

    Args:
        cmd: 命令名（已解析别名为 canonical）
        user_desc: 用户附加描述
        session: Session 实例，需有 add_user 方法
        working_dir: 工作目录路径

    Returns:
        "injected" — 已注入，主循环将其作为新 prompt
        错误消息字符串 — 未注入，直接显示给用户
    """
    # 解析别名
    canonical = ALIASES.get(cmd, cmd)
    prompt = AI_ANALYSIS_COMMANDS.get(canonical)
    if prompt is None:
        return f"[ERR] 未知命令: {cmd}（可用: {', '.join(AI_ANALYSIS_COMMANDS.keys())}）"

    # /explain 必须带目标
    if canonical == "/explain" and not user_desc.strip():
        return "用法: /explain <代码片段或概念>"

    # 组合 prompt + 用户描述
    combined = f"{prompt}\n---\n\n# 用户任务\n{user_desc}" if user_desc.strip() else prompt
    session.add_user(combined)
    return "injected"
