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

"""
测试图片拼贴功能

该脚本演示如何独立使用simple_collage模块创建图片拼贴。
"""

import os
import sys
import argparse
import time
import random
from pathlib import Path
from PIL import Image

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

from core import simple_collage

def parse_arguments():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description='测试图片拼贴功能')
    parser.add_argument('--input_dir', '-i', type=str, 
                        help='输入图片目录路径')
    parser.add_argument('--output_dir', '-o', type=str, default='collage_output',
                        help='输出拼贴图保存目录，默认为"collage_output"')
    parser.add_argument('--width', '-w', type=int, default=900,
                        help='拼贴图宽度，默认为900')
    parser.add_argument('--height', '-h', type=int, default=1200,
                        help='拼贴图高度，默认为1200')
    parser.add_argument('--count', '-c', type=int, default=3,
                        help='生成拼贴图数量，默认为3')
    parser.add_argument('--seed', '-s', type=int, default=None,
                        help='随机种子，用于重现结果')
    return parser.parse_args()

def get_image_files(directory):
    """获取目录中的所有图片文件"""
    if not os.path.exists(directory):
        raise FileNotFoundError(f"目录不存在: {directory}")
    
    image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff']
    image_files = []
    
    for root, _, files in os.walk(directory):
        for file in files:
            if any(file.lower().endswith(ext) for ext in image_extensions):
                image_files.append(os.path.join(root, file))
    
    if not image_files:
        raise ValueError(f"目录中没有找到有效的图片文件: {directory}")
    
    return image_files

def create_test_images(directory, count=5, size=(640, 480)):
    """如果没有提供输入目录，创建测试图片"""
    if not os.path.exists(directory):
        os.makedirs(directory)
    
    colors = [
        (255, 0, 0),     # 红色
        (0, 255, 0),     # 绿色
        (0, 0, 255),     # 蓝色
        (255, 255, 0),   # 黄色
        (255, 0, 255),   # 紫色
        (0, 255, 255),   # 青色
        (255, 165, 0),   # 橙色
        (128, 0, 128),   # 紫色
        (210, 105, 30),  # 巧克力色
        (0, 128, 128)    # 墨绿色
    ]
    
    image_files = []
    for i in range(count):
        # 随机选择颜色
        color = colors[i % len(colors)]
        
        # 创建纯色图片
        img = Image.new('RGB', size, color)
        
        # 保存图片
        file_path = os.path.join(directory, f"test_image_{i+1}.jpg")
        img.save(file_path)
        image_files.append(file_path)
        print(f"创建测试图片: {file_path}")
    
    return image_files

def main():
    """主函数"""
    args = parse_arguments()
    
    # 设置随机种子
    if args.seed is not None:
        random.seed(args.seed)
    
    # 确保输出目录存在
    if not os.path.exists(args.output_dir):
        os.makedirs(args.output_dir)
    
    # 获取输入图片
    if not args.input_dir:
        print("未提供输入目录，创建测试图片...")
        test_img_dir = os.path.join(args.output_dir, "test_images")
        image_files = create_test_images(test_img_dir, count=7)
        input_dir = test_img_dir
    else:
        input_dir = args.input_dir
        try:
            # 尝试获取图片文件列表，验证目录有效
            get_image_files(input_dir)
        except Exception as e:
            print(f"错误: {e}")
            return
    
    # 设置目标尺寸
    target_size = (args.width, args.height)
    print(f"使用输入目录: {input_dir}")
    print(f"拼贴图尺寸: {target_size}")
    
    # 生成拼贴图
    print(f"开始生成{args.count}张拼贴图...")
    start_time = time.time()
    
    try:
        # 创建与测试不同样式的拼贴图
        collage_creator = simple_collage.ImageCollageCreator()
        
        # 1. 处理整个目录，获取多个拼贴图
        print("方法1: 使用process_directory批量生成")
        collages, used_image_names = simple_collage.process_directory(
            input_dir,
            target_size=target_size,
            output_count=args.count
        )
        
        if not collages:
            print("拼贴图生成失败！")
            return
        
        # 保存拼贴图
        for i, collage in enumerate(collages):
            output_path = os.path.join(args.output_dir, f"collage_auto_{i+1}.png")
            collage.save(output_path)
            # 输出使用的图片名称
            if i < len(used_image_names):
                print(f"拼贴图已保存: {output_path}，使用图片: {used_image_names[i]}")
            else:
                print(f"拼贴图已保存: {output_path}")
        
        # 2. 使用不同风格创建拼贴图
        print("\n方法2: 测试不同风格")
        styles = ["grid", "asymmetrical", "filmstrip", "overlap", "mosaic"]
        
        for style in styles:
            print(f"创建 {style} 风格拼贴图...")
            try:
                collage, selected_images = collage_creator.create_collage_with_style(input_dir, style, target_size)
                if collage:
                    output_path = os.path.join(args.output_dir, f"collage_style_{style}.png")
                    collage.save(output_path)
                    print(f"风格拼贴图已保存: {output_path}，使用图片: {selected_images}")
                else:
                    print(f"创建 {style} 风格失败: 未返回有效拼贴图")
            except Exception as e:
                print(f"创建 {style} 风格失败: {e}")
        
        elapsed = time.time() - start_time
        print(f"\n拼贴图生成完成，总耗时: {elapsed:.2f}秒")
        print(f"输出目录: {os.path.abspath(args.output_dir)}")
    
    except Exception as e:
        print(f"拼贴图生成出错: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main() 