#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
测试PromptManager组件

该脚本演示如何独立使用prompt_manager模块构建不同场景的提示词。
"""

import os
import sys
import tempfile
import json
from pathlib import Path

# 将项目根目录添加到PATH
project_root = str(Path(__file__).parent.parent.absolute())
if project_root not in sys.path:
    sys.path.append(project_root)

from utils.prompt_manager import PromptManager

def create_test_files():
    """创建测试用的提示词文件和资源文件"""
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    
    # 创建提示词目录结构
    prompts_dir = os.path.join(temp_dir, "prompts")
    os.makedirs(prompts_dir, exist_ok=True)
    
    # 创建Style和Demand子目录
    style_dir = os.path.join(prompts_dir, "Style")
    demand_dir = os.path.join(prompts_dir, "Demand")
    refer_dir = os.path.join(prompts_dir, "Refer")
    
    os.makedirs(style_dir, exist_ok=True)
    os.makedirs(demand_dir, exist_ok=True)
    os.makedirs(refer_dir, exist_ok=True)
    
    # 创建Topic提示词文件
    topic_system_path = os.path.join(temp_dir, "topic_system.txt")
    with open(topic_system_path, 'w', encoding='utf-8') as f:
        f.write("您是旅游内容选题专家。请根据提供的信息，生成高质量的旅游选题。")
    
    topic_user_path = os.path.join(temp_dir, "topic_user.txt")
    with open(topic_user_path, 'w', encoding='utf-8') as f:
        f.write("生成{num}个旅游内容选题，日期为{date}。")
    
    # 创建Content提示词文件
    content_system_path = os.path.join(temp_dir, "content_system.txt")
    with open(content_system_path, 'w', encoding='utf-8') as f:
        f.write("您是旅游内容创作专家。请根据选题和参考资料，生成优质旅游内容。")
    
    # 创建Style文件
    style_file = os.path.join(style_dir, "摄影指南.txt")
    with open(style_file, 'w', encoding='utf-8') as f:
        f.write("这是一篇摄影风格的旅游文章，应该包含构图技巧、最佳拍摄时间和角度建议。")
    
    # 创建Demand文件
    demand_file = os.path.join(demand_dir, "亲子游.txt")
    with open(demand_file, 'w', encoding='utf-8') as f:
        f.write("这是一篇面向家庭旅游者的文章，应该包含适合儿童的活动和安全提示。")
    
    # 创建Resource目录和文件
    resource_dir = os.path.join(temp_dir, "resource")
    os.makedirs(resource_dir, exist_ok=True)
    
    # 创建一个景点描述文件
    desc_file = os.path.join(resource_dir, "泰宁古城描述.txt")
    with open(desc_file, 'w', encoding='utf-8') as f:
        f.write("泰宁古城是一座有着八百年历史的古城，保存了大量明清时期的建筑。")
    
    # 返回创建的文件路径
    return {
        "temp_dir": temp_dir,
        "prompts_dir": prompts_dir,
        "topic_system_path": topic_system_path,
        "topic_user_path": topic_user_path,
        "content_system_path": content_system_path,
        "resource_dir": resource_dir,
        "desc_file": desc_file,
        "style_file": style_file,
        "demand_file": demand_file
    }

def create_topic_item():
    """创建测试用的选题项"""
    return {
        "index": 1,
        "date": "2024-05-30",
        "logic": "这是一个著名的景点，有丰富的历史文化底蕴，适合文化和历史爱好者。",
        "object": "泰宁古城",
        "product": "文化体验套票.txt",
        "product_logic": "泰宁古城有多处明清古建筑，游客可以通过体验套票更全面了解当地历史文化。",
        "style": "摄影指南.txt",
        "style_logic": "古城拥有800多年历史，古建筑保存完好，适合摄影风格。",
        "target_audience": "亲子游.txt",
        "target_audience_logic": "古城内有适合家庭参观的展览和互动活动，老人孩子都能找到感兴趣的内容。"
    }

def main():
    """主函数"""
    print("=== 测试 PromptManager 组件 ===")
    
    # 创建测试文件
    test_files = create_test_files()
    print(f"创建临时测试文件夹: {test_files['temp_dir']}")
    
    try:
        # 创建资源文件配置
        resource_dir_config = [
            {
                "type": "Description",
                "file_path": [test_files["desc_file"]]
            }
        ]
        
        # 初始化PromptManager
        prompt_manager = PromptManager(
            topic_system_prompt_path=test_files["topic_system_path"],
            topic_user_prompt_path=test_files["topic_user_path"],
            content_system_prompt_path=test_files["content_system_path"],
            prompts_dir=test_files["prompts_dir"],
            resource_dir_config=resource_dir_config,
            topic_gen_num=3,
            topic_gen_date="2024-05-30"
        )
        
        print("\n测试1: 获取选题提示词")
        system_prompt, user_prompt = prompt_manager.get_topic_prompts()
        
        print(f"系统提示词 ({len(system_prompt)} 字符):")
        print(system_prompt)
        print(f"\n用户提示词 ({len(user_prompt)} 字符):")
        print(user_prompt)
        
        # 验证变量替换
        if "{num}" not in user_prompt and "3" in user_prompt:
            print("测试通过: {num} 成功替换为 3")
        else:
            print("测试失败: {num} 未被正确替换")
            
        if "{date}" not in user_prompt and "2024-05-30" in user_prompt:
            print("测试通过: {date} 成功替换为 2024-05-30")
        else:
            print("测试失败: {date} 未被正确替换")
        
        print("\n测试2: 获取内容生成提示词")
        topic_item = create_topic_item()
        
        system_prompt, user_prompt = prompt_manager.get_content_prompts(topic_item)
        
        print(f"系统提示词 ({len(system_prompt)} 字符):")
        print(system_prompt[:200] + "..." if len(system_prompt) > 200 else system_prompt)
        print(f"\n用户提示词 ({len(user_prompt)} 字符):")
        print(user_prompt[:200] + "..." if len(user_prompt) > 200 else user_prompt)
        
        # 验证样式和目标受众内容是否包含在提示词中
        with open(test_files["style_file"], 'r', encoding='utf-8') as f:
            style_content = f.read()
        
        with open(test_files["demand_file"], 'r', encoding='utf-8') as f:
            demand_content = f.read()
        
        if style_content in user_prompt:
            print("测试通过: 样式文件内容成功包含在用户提示词中")
        else:
            print("测试失败: 样式文件内容未包含在用户提示词中")
            
        if demand_content in user_prompt:
            print("测试通过: 目标受众文件内容成功包含在用户提示词中")
        else:
            print("测试失败: 目标受众文件内容未包含在用户提示词中")
            
        # 验证景点描述是否包含
        with open(test_files["desc_file"], 'r', encoding='utf-8') as f:
            desc_content = f.read()
            
        if desc_content in user_prompt:
            print("测试通过: 景点描述文件内容成功包含在用户提示词中")
        else:
            print("测试失败: 景点描述文件内容未包含在用户提示词中")
        
        print("\n测试3: 异常处理")
        # 测试不存在的风格文件
        non_existent_topic = topic_item.copy()
        non_existent_topic["style"] = "不存在的风格.txt"
        
        system_prompt, user_prompt = prompt_manager.get_content_prompts(non_existent_topic)
        print("获取提示词成功，即使风格文件不存在")
        
    except Exception as e:
        print(f"测试过程中出错: {e}")
        import traceback
        traceback.print_exc()
    
    finally:
        # 清理临时文件
        import shutil
        try:
            shutil.rmtree(test_files["temp_dir"])
            print(f"\n清理临时文件: {test_files['temp_dir']}")
        except Exception as e:
            print(f"清理临时文件失败: {e}")
    
    print("\n=== 测试完成 ===")

if __name__ == "__main__":
    main() 