# -*- coding: utf-8 -*-
"""
Guideline 管理器

统一的 CTF 题目生成 guideline 文件管理逻辑，供各 AI 服务共用
"""

import shutil
from pathlib import Path
from typing import Optional


class GuidelineManager:
    """CTF 题目生成 Guideline 管理器
    
    统一处理 guideline 文件的选择和复制逻辑
    """
    
    # 难度到 guideline 文件的映射
    DIFFICULTY_MAP = {
        '入门': 'ctf-generation-guide-easy.md',
        '简单': 'ctf-generation-guide-easy.md',
        '中等': 'ctf-generation-guide-medium-hard.md',
        '困难': 'ctf-generation-guide-medium-hard.md'
    }
    
    # 默认 guideline 文件
    DEFAULT_GUIDELINE = 'ctf-generation-guide-medium-hard.md'
    
    @classmethod
    def get_guideline_file(cls, difficulty: str) -> str:
        """根据难度获取对应的 guideline 文件名
        
        Args:
            difficulty: 难度级别（入门/简单/中等/困难）
            
        Returns:
            guideline 文件名
        """
        return cls.DIFFICULTY_MAP.get(difficulty, cls.DEFAULT_GUIDELINE)
    
    @classmethod
    def setup_for_augment(cls, ge10_dir: Path, difficulty: str, verbose: bool = True) -> bool:
        """为 Augment CLI 设置 guideline 文件
        
        将对应难度的 guideline 复制到 Augment 读取的位置
        
        Args:
            ge10_dir: ge10 目录路径
            difficulty: 难度级别
            verbose: 是否输出详细信息
            
        Returns:
            是否成功
        """
        guideline_file = cls.get_guideline_file(difficulty)
        
        # 源文件路径
        source_file = ge10_dir / '.augment' / 'rules' / guideline_file
        
        # 目标文件路径（Augment 实际读取的文件）
        target_file = ge10_dir / '.augment' / 'rules' / 'ctf-generation-guide.md'
        
        # 检查源文件是否存在
        if not source_file.exists():
            if verbose:
                print(f"⚠️  警告: 找不到难度 '{difficulty}' 对应的guideline文件: {source_file}")
                print(f"⚠️  将使用默认的中等/困难难度guideline")
            return False
        
        # 复制文件
        try:
            shutil.copy2(str(source_file), str(target_file))
            if verbose:
                print(f"✅ 已根据难度 '{difficulty}' 选择guideline: {guideline_file}")
                cls._print_optimization_info(difficulty)
            return True
        except Exception as e:
            if verbose:
                print(f"⚠️  警告: 复制guideline文件失败: {e}")
                print(f"⚠️  将使用现有的guideline文件")
            return False
    
    @classmethod
    def setup_for_claude(cls, ge10_dir: Path, difficulty: str, verbose: bool = True) -> bool:
        """为 Claude CLI 设置 guideline 文件
        
        将对应难度的 guideline 复制到 CLAUDE.md
        
        Args:
            ge10_dir: ge10 目录路径
            difficulty: 难度级别
            verbose: 是否输出详细信息
            
        Returns:
            是否成功
        """
        rules_dir = ge10_dir / ".augment" / "rules"
        claude_md = ge10_dir / "CLAUDE.md"
        
        if difficulty in ['入门', '简单']:
            source_file = rules_dir / "ctf-generation-guide-easy.md"
        else:
            source_file = rules_dir / "ctf-generation-guide-medium-hard.md"
        
        if source_file.exists():
            try:
                shutil.copy2(source_file, claude_md)
                if verbose:
                    print(f"✅ 已根据难度 '{difficulty}' 复制guideline到 CLAUDE.md: {source_file.name}")
                return True
            except Exception as e:
                if verbose:
                    print(f"⚠️  复制guideline文件失败: {e}")
                return False
        else:
            if verbose:
                print(f"⚠️  未找到难度对应的guideline文件: {source_file}")
            return False
    
    @classmethod
    def _print_optimization_info(cls, difficulty: str):
        """打印 token 优化信息
        
        Args:
            difficulty: 难度级别
        """
        if difficulty in ['入门', '简单']:
            if difficulty == '入门':
                print(f"💡 入门难度优化: 预计节省约60-70%的token消耗")
            else:
                print(f"💡 简单难度优化: 预计节省约40-50%的token消耗")
            print(f"   - 精简学习阶段（{difficulty}难度：{'1-2' if difficulty == '入门' else '3-5'}篇writeup）")
            print(f"   - 极简知识模块化（快速跳过）")
            print(f"   - 轻量级质量检查")
        else:
            print(f"💡 中等/困难难度: 使用完整的8阶段流程，确保题目质量")
