# -*- coding: utf-8 -*-
"""
提示词加载模块
加载系统提示词并注入环境信息 + 核心工程方法论
"""
import os

from .methodologies import LAZY_CODING, TDD_DISCIPLINE, DEBUG_DISCIPLINE


def load_system_prompt(project_path: str = None) -> str:
    """加载系统提示词，注入环境信息和核心工程方法论。"""
    prompt_path = os.path.join(os.path.dirname(__file__), "system_prompt.md")
    with open(prompt_path, "r", encoding="utf-8") as f:
        prompt = f.read()

    cwd = project_path or os.getcwd()

    # 动态收集项目上下文（失败降级为空，不阻塞启动）
    # {{WORKING_DIR}} 占位符替换为「cwd + 项目上下文全文」
    project_context_text = _collect_project_context(cwd)
    if project_context_text:
        working_dir_block = f"{cwd}\n\n{project_context_text}"
    else:
        working_dir_block = cwd
    prompt = prompt.replace("{{WORKING_DIR}}", working_dir_block)

    # 追加核心工程方法论（常驻层）
    prompt += "\n\n---\n\n# 工程方法论（核心准则）\n"
    prompt += "以下方法论是你的默认行为准则，每次任务自动生效：\n"
    prompt += LAZY_CODING
    prompt += TDD_DISCIPLINE
    prompt += DEBUG_DISCIPLINE

    # 追加知识捕获指令（事件驱动 + 任务后自反思）
    prompt += _KNOWLEDGE_CAPTURE_INSTRUCTIONS

    return prompt


def _collect_project_context(cwd: str) -> str:
    """调用 ProjectContextService 收集当前项目的结构信息。

    失败时返回空字符串，由调用方降级（不阻塞 CLI 启动）。
    AI 在无项目上下文时会回退到 shell_exec 列目录。

    缓存命中（内存/文件）秒回；首次未命中同步收集（git/file_tree），
    最多阻塞 1-2 秒，结果会写入三级缓存供后续会话复用。
    """
    try:
        # 延迟导入：避免顶层循环依赖（prompts 是底层模块）
        from abyss.context.project_context import (
            get_default_service,
            ProjectContextService,
        )
        service = get_default_service()
        ctx = service.get_context(cwd)
        if ctx is None:
            return ""
        return ProjectContextService.format_project_context(ctx)
    except Exception:
        # 探测失败不阻塞 CLI 启动
        return ""


_KNOWLEDGE_CAPTURE_INSTRUCTIONS = """

---\n
# 知识捕获纪律（硬规则，必须执行）

你内置了 knowledge_save 工具，用于持久化用户偏好、bug 修复、编码经验。以下规则不可跳过：

## 触发条件与时机（必须遵守）

1. **用户偏好（最高优先级，立即执行）**：用户说出"我喜欢/我习惯/请用/不要用/我偏好"等表达时，
   **必须在做任何其他工具调用之前**，先调用 knowledge_save 保存偏好。
   - category=preference, level=global
   - tags 包含关键词（如 type-hints、python、naming-style）
   - 例：用户说"我喜欢用 type hints"→ 立即 knowledge_save(name="user-prefers-type-hints", category="preference", level="global", ...)

2. **Bug 修复（修复确认后立即执行）**：bug 已修复并通过验证后，**必须**调用 knowledge_save 记录。
   - category=bugfix, level=project
   - tags 包含错误类型和涉及文件

3. **编码经验（任务完成后自反思）**：任务完成后自反思是否学到可复用模式，有则保存。
   - category=experience, level=project 或 global

4. **工具经验（发现时立即执行）**：发现某工具的特定用法/坑点时保存。
   - category=tool, level=global

## 关键约束

- **偏好捕获是硬纪律，不是可选项**：即便用户的主要诉求是写代码/修 bug，
  只要消息中含偏好表达，必须先 knowledge_save 再继续任务。
- 偏好类知识自动去重合并，重复保存不会产生副作用，无需担心。
- 忽略此纪律等同于忽略"调试纪律"等其他硬规则。
"""