#!/usr/bin/env python3
"""
测试新的颜色处理逻辑
"""

import sys
import asyncio
import os
from datetime import datetime

# 添加项目根目录到 Python 路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from app.core.database import get_db
from app.utils.color_processor import ColorProcessor, process_color_attribute, extract_color_from_product_info


def test_color_processor():
    """测试颜色处理器的各种功能"""
    print("=== 颜色处理器测试 ===\n")
    
    processor = ColorProcessor()
    
    # 测试用例
    test_cases = [
        # 基础中文颜色
        ("黑色", "黑色 (Black)"),
        ("白色", "白色 (White)"),
        ("红色", "红色 (Red)"),
        ("蓝色", "蓝色 (Blue)"),
        
        # 复合中文颜色
        ("深蓝色", "深蓝色 (Dark Blue)"),
        ("浅灰色", "浅灰色 (Light Gray)"),
        ("军绿色", "军绿色 (Army Green)"),
        ("酒红色", "酒红色 (Wine Red)"),
        
        # 英文颜色
        ("Black", "Black"),
        ("Navy Blue", "Navy Blue"),
        ("Dark Gray", "Dark Gray"),
        ("grey", "Gray"),
        ("off-white", "Off White"),
        
        # 品牌特色颜色
        ("POPPY", "POPPY"),
        ("SAGE", "SAGE"),
        ("CHAMPAGNE", "CHAMPAGNE"),
        ("NUDE", "NUDE"),
        
        # 颜色代码
        ("A001", "A001"),
        ("B2B2B2", "B2B2B2"),
        ("#FF0000", "#FF0000"),
        
        # 混合颜色
        ("黑色Black", "黑色 (Black)"),
        ("白色WHITE", "白色 (White)"),
        ("深蓝Navy", "深蓝色 (Navy)"),
        
        # 应该保持原样的情况
        ("未知颜色", "未知颜色"),
        ("", None),
        (None, None),
    ]
    
    print("1. 颜色处理测试:")
    for input_color, expected in test_cases:
        result = processor.process_color(input_color)
        status = "✓" if result == expected else "✗"
        result_str = str(result) if result is not None else "None"
        expected_str = str(expected) if expected is not None else "None"
        print(f"   {status} {str(input_color):15} -> {result_str:25} (期望: {expected_str})")
    
    print("\n2. 从文本中提取颜色测试:")
    text_cases = [
        ("小王国 Burberry 黑色风衣 M码", "黑色 (Black)"),
        ("Acne Studios 白色T恤 S码", "白色 (White)"),
        ("Alexander McQueen 红色_L", "红色 (Red)"),
        ("商品名称 [深蓝色] 其他信息", "深蓝色 (Dark Blue)"),
        ("颜色:POPPY 其他属性", "POPPY"),
        ("Color:Navy Blue Size:M", "Navy Blue"),
        ("无颜色信息的商品", None),
    ]
    
    for text, expected in text_cases:
        result = processor.extract_color_from_text(text)
        status = "✓" if result == expected else "✗"
        result_str = str(result) if result is not None else "None"
        expected_str = str(expected) if expected is not None else "None"
        print(f"   {status} {text:40} -> {result_str:25} (期望: {expected_str})")


async def test_database_color_processing():
    """测试数据库中的颜色处理"""
    print("\n=== 数据库颜色处理测试 ===\n")
    
    async for db in get_db():
        try:
            from sqlalchemy import select, func, text
            
            # 查询一些现有的颜色数据
            result = await db.execute(text("""
                SELECT 线上宝贝名称, 线上销售属性, 颜色
                FROM order_items_norm 
                WHERE 颜色 IS NOT NULL 
                ORDER BY updated_at DESC 
                LIMIT 20
            """))
            
            orders = result.fetchall()
            
            print("当前数据库中的颜色示例:")
            print("序号 | 商品名称 | 销售属性 | 当前颜色 | 优化后颜色")
            print("-" * 100)
            
            for i, order in enumerate(orders, 1):
                product_name = order[0] or ""
                sales_attrs = order[1] or ""
                current_color = order[2] or ""
                
                # 使用新颜色处理器处理
                optimized_color = process_color_attribute(current_color)
                
                # 如果优化后的颜色与当前颜色不同，标记为需要更新
                status = "需要更新" if optimized_color != current_color else "无需更新"
                
                print(f"{i:2d}   | {product_name[:20]:20} | {sales_attrs[:15]:15} | {current_color[:15]:15} | {optimized_color[:20]:20} [{status}]")
            
            print(f"\n共检查了 {len(orders)} 条记录")
            
            # 统计需要更新的记录数量
            needs_update_count = 0
            for order in orders:
                current_color = order[2] or ""
                optimized_color = process_color_attribute(current_color)
                if optimized_color != current_color:
                    needs_update_count += 1
            
            print(f"其中 {needs_update_count} 条记录需要颜色处理优化")
            
        except Exception as e:
            print(f"数据库测试过程中发生错误: {e}")
            import traceback
            traceback.print_exc()
        
        break


def test_specific_color_scenarios():
    """测试特定的颜色场景"""
    print("\n=== 特定场景测试 ===\n")
    
    processor = ColorProcessor()
    
    # 测试实际遇到的颜色名称
    real_world_cases = [
        # 常见的中英文混合
        "黑Black",
        "白White", 
        "红Red",
        "蓝Blue",
        
        # 品牌特色颜色
        "POPPY 626",  # 测试是否会误识别为颜色+数字
        "SAGE GREEN",
        "CHAMPAGNE GOLD",
        
        # 复合描述
        "深色系",
        "浅色调",
        "经典黑",
        "纯白色",
        
        # 可能被误处理的情况  
        "2024黑色",  # 包含年份
        "8.14白色",  # 包含日期
        "SIZE黑色",  # 包含尺码信息
    ]
    
    print("实际场景颜色处理测试:")
    for color_text in real_world_cases:
        result = processor.process_color(color_text)
        print(f"   {color_text:20} -> {result}")
    
    print("\n文本提取测试:")
    text_extraction_cases = [
        "小王国 Acne Studios 黑色短袖T恤 TSHI000046代购8.19",
        "Alexander McQueen 白色小白鞋 586402 1000 Size:39",
        "Burberry 深蓝色风衣 POPPY款 M码",
        "Stuart Weitzman 棕色LA_6.5[/37] 靴子",
        "The Row 米色 (Beige) 手提包 Margaux",
        "商品名称_黑色_L",
        "Color: CHAMPAGNE, Size: M",
        "颜色：深蓝色，尺码：L",
    ]
    
    for text in text_extraction_cases:
        color = extract_color_from_product_info(text, "")
        print(f"   {text[:50]:50} -> {color}")


async def main():
    """主函数"""
    print("颜色处理优化测试")
    print("=" * 60)
    
    # 基础功能测试
    test_color_processor()
    
    # 特定场景测试
    test_specific_color_scenarios()
    
    # 数据库测试
    await test_database_color_processing()
    
    print("\n" + "=" * 60)
    print("测试完成")


if __name__ == "__main__":
    asyncio.run(main())