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

"""
测试ResourceLoader组件

该脚本演示如何独立使用resource_loader模块加载资源文件。
"""

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.resource_loader import ResourceLoader

def create_test_files():
    """创建测试用的资源文件结构"""
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    
    # 创建资源目录结构
    resources_dir = os.path.join(temp_dir, "resources")
    os.makedirs(resources_dir, exist_ok=True)
    
    # 创建各类资源子目录
    image_dir = os.path.join(resources_dir, "images")
    font_dir = os.path.join(resources_dir, "fonts")
    sticker_dir = os.path.join(resources_dir, "stickers")
    background_dir = os.path.join(resources_dir, "backgrounds")
    
    os.makedirs(image_dir, exist_ok=True)
    os.makedirs(font_dir, exist_ok=True)
    os.makedirs(sticker_dir, exist_ok=True)
    os.makedirs(os.path.join(background_dir, "portrait"), exist_ok=True)
    os.makedirs(os.path.join(background_dir, "landscape"), exist_ok=True)
    
    # 创建测试图片文件（创建文本文件代替）
    img1_path = os.path.join(image_dir, "test1.jpg")
    img2_path = os.path.join(image_dir, "test2.png")
    
    with open(img1_path, 'w') as f:
        f.write("Dummy JPG image file")
    
    with open(img2_path, 'w') as f:
        f.write("Dummy PNG image file")
    
    # 创建字体文件
    font1_path = os.path.join(font_dir, "test_font1.ttf")
    font2_path = os.path.join(font_dir, "test_font2.ttf")
    
    with open(font1_path, 'w') as f:
        f.write("Dummy TTF font file 1")
    
    with open(font2_path, 'w') as f:
        f.write("Dummy TTF font file 2")
    
    # 创建贴纸文件
    sticker1_path = os.path.join(sticker_dir, "sticker1.png")
    sticker2_path = os.path.join(sticker_dir, "sticker2.png")
    
    with open(sticker1_path, 'w') as f:
        f.write("Dummy sticker file 1")
    
    with open(sticker2_path, 'w') as f:
        f.write("Dummy sticker file 2")
    
    # 创建背景文件
    bg_portrait_path = os.path.join(background_dir, "portrait", "bg1.jpg")
    bg_landscape_path = os.path.join(background_dir, "landscape", "bg1.jpg")
    
    with open(bg_portrait_path, 'w') as f:
        f.write("Dummy portrait background")
    
    with open(bg_landscape_path, 'w') as f:
        f.write("Dummy landscape background")
    
    # 创建配置文件
    config_path = os.path.join(temp_dir, "config.json")
    config = {
        "resource_dir": resources_dir,
        "font_dir": font_dir,
        "sticker_dir": sticker_dir,
        "bg_portrait_dir": os.path.join(background_dir, "portrait"),
        "bg_landscape_dir": os.path.join(background_dir, "landscape"),
        "output_dir": os.path.join(temp_dir, "output")
    }
    
    with open(config_path, 'w') as f:
        json.dump(config, f, indent=2)
    
    # 返回创建的文件路径
    return {
        "temp_dir": temp_dir,
        "resources_dir": resources_dir,
        "config_path": config_path,
        "image_dir": image_dir,
        "font_dir": font_dir,
        "sticker_dir": sticker_dir,
        "bg_portrait_dir": os.path.join(background_dir, "portrait"),
        "bg_landscape_dir": os.path.join(background_dir, "landscape"),
    }

def main():
    """主函数"""
    print("=== 测试 ResourceLoader 组件 ===")
    
    # 创建测试文件
    test_files = create_test_files()
    print(f"创建临时测试文件夹: {test_files['temp_dir']}")
    
    try:
        # 加载配置
        with open(test_files["config_path"], 'r') as f:
            config = json.load(f)
        
        # 初始化ResourceLoader
        resource_loader = ResourceLoader(config)
        
        # 测试1: 加载字体
        print("\n测试1: 加载字体文件")
        fonts = resource_loader.load_fonts()
        print(f"加载字体数量: {len(fonts)}")
        if len(fonts) == 2:
            print("测试通过: 成功加载了2个字体文件")
        else:
            print(f"测试失败: 应加载2个字体文件，实际加载了{len(fonts)}个")
        
        # 测试2: 加载贴纸
        print("\n测试2: 加载贴纸文件")
        stickers = resource_loader.load_stickers()
        print(f"加载贴纸数量: {len(stickers)}")
        if len(stickers) == 2:
            print("测试通过: 成功加载了2个贴纸文件")
        else:
            print(f"测试失败: 应加载2个贴纸文件，实际加载了{len(stickers)}个")
        
        # 测试3: 加载背景图
        print("\n测试3: 加载背景图文件")
        portrait_bgs = resource_loader.load_backgrounds("portrait")
        landscape_bgs = resource_loader.load_backgrounds("landscape")
        
        print(f"加载竖版背景数量: {len(portrait_bgs)}")
        print(f"加载横版背景数量: {len(landscape_bgs)}")
        
        if len(portrait_bgs) == 1:
            print("测试通过: 成功加载了1个竖版背景文件")
        else:
            print(f"测试失败: 应加载1个竖版背景文件，实际加载了{len(portrait_bgs)}个")
            
        if len(landscape_bgs) == 1:
            print("测试通过: 成功加载了1个横版背景文件")
        else:
            print(f"测试失败: 应加载1个横版背景文件，实际加载了{len(landscape_bgs)}个")
        
        # 测试4: 创建输出目录
        print("\n测试4: 创建输出目录")
        output_dir = resource_loader.get_output_dir()
        if os.path.exists(output_dir):
            print(f"测试通过: 成功创建输出目录 {output_dir}")
        else:
            print(f"测试失败: 未能成功创建输出目录 {output_dir}")
        
        # 测试5: 异常处理 - 非法方向
        print("\n测试5: 异常处理 - 加载非法方向背景")
        try:
            invalid_bgs = resource_loader.load_backgrounds("invalid_direction")
            print("测试失败: 应该抛出异常但未抛出")
        except ValueError as e:
            print(f"测试通过: 成功捕获到期望的ValueError异常: {e}")
        except Exception as e:
            print(f"测试失败: 捕获到意外的异常类型: {type(e).__name__}")
        
    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() 