"""
Phase 2 简化测试
"""

import pytest
from app.utils.text_parser import BrandExtractor, ProductCodeExtractor, AttributeExtractor, generate_sku_id, slug
from app.utils.image_processor import ImageProcessor


def test_slug_function():
    """测试 slug 函数"""
    assert slug("Nike Air Max") == "nike_air_max"
    assert slug("ADIDAS-SHOES") == "adidas_shoes"
    assert slug("Product 123!@#") == "product_123"
    assert slug("  Space  Test  ") == "space_test"
    assert slug("") == ""


def test_brand_extractor():
    """测试品牌提取器"""
    aliases = {
        "nike": "NIKE",
        "adidas": "ADIDAS", 
        "puma": "PUMA"
    }
    
    extractor = BrandExtractor(aliases)
    
    # 测试别名匹配
    assert extractor.extract_brand("Nike 运动鞋") == "NIKE"
    assert extractor.extract_brand("Adidas外套") == "ADIDAS"
    
    # 测试首词提取
    assert extractor.extract_brand("Puma 背包") == "PUMA"
    
    # 测试括号提取
    assert extractor.extract_brand("运动鞋（Nike）经典款") == "NIKE"
    
    # 测试未匹配情况
    brand = extractor.extract_brand("UnknownBrand 商品")
    assert brand == "UnknownBrand"


def test_product_code_extractor():
    """测试货号提取器"""
    extractor = ProductCodeExtractor()
    
    # 测试基本提取
    assert extractor.extract_product_code("Nike AJ1234 Low") == "AJ1234"
    assert extractor.extract_product_code("Adidas BOOST350 V2") == "BOOST350"
    
    # 测试带品牌过滤
    assert extractor.extract_product_code("Nike AJ1234 Low", "Nike") == "AJ1234"
    
    # 测试数字开头
    assert extractor.extract_product_code("商品 123ABC 款式") == "123ABC"


def test_attribute_extractor():
    """测试属性提取器"""
    color_aliases = {"黑": "黑色", "白": "白色", "blue": "蓝色"}
    size_aliases = {"L": "L", "XL": "XL", "42": "42"}
    
    extractor = AttributeExtractor(color_aliases, size_aliases)
    
    # 测试结构化属性提取
    attrs = extractor.extract_attributes(
        "Nike 运动鞋",
        "颜色:黑色;尺码:42"
    )
    assert attrs["color"] == "黑色"
    assert attrs["size"] == "42"
    
    # 测试别名匹配
    attrs = extractor.extract_attributes(
        "商品名称 黑 L码",
        ""
    )
    assert attrs["color"] == "黑色"
    assert attrs["size"] == "L"


def test_generate_sku_id():
    """测试 SKU ID 生成"""
    sku_id = generate_sku_id("NK001", "SP001", "SKU001", "black", "42")
    assert "nk001" in sku_id
    assert "black" in sku_id
    assert "42" in sku_id
    
    # 测试空值处理
    sku_id = generate_sku_id(None, None, None, "red", "L")
    assert "unknown" in sku_id
    assert "red" in sku_id
    assert "l" in sku_id


def test_image_processor():
    """测试图片处理器"""
    processor = ImageProcessor()
    
    # 测试分隔符处理
    images = processor.process_image_links("http://img1.jpg,http://img2.jpg")
    assert len(images) == 2
    assert "http://img1.jpg" in images
    
    # 测试不同分隔符
    images = processor.process_image_links("http://img1.jpg;http://img2.jpg|http://img3.jpg")
    assert len(images) == 3
    
    # 测试无效URL过滤
    images = processor.process_image_links("http://img1.jpg,invalid_url,http://img2.jpg")
    assert len(images) == 2
    
    # 测试JSON序列化
    json_str = processor.serialize_images(["http://img1.jpg", "http://img2.jpg"])
    assert "http://img1.jpg" in json_str
    
    # 测试JSON反序列化
    images = processor.deserialize_images(json_str)
    assert len(images) == 2


def test_brand_extractor_suggestions():
    """测试品牌别名建议功能"""
    aliases = {
        "nike": "NIKE",
        "adidas": "ADIDAS"
    }
    
    extractor = BrandExtractor(aliases)
    
    # 测试建议生成
    suggestions = extractor.suggest_new_alias("Nike Air Max", threshold=80)
    # 由于 Nike 已经存在于别名中，不应该生成建议
    assert len(suggestions) == 0
    
    # 测试相似品牌建议
    suggestions = extractor.suggest_new_alias("NIKE Air Max", threshold=80) 
    # NIKE 与 nike 相似但大小写不同，应该能匹配
    found_suggestion = False
    for suggestion in suggestions:
        if suggestion['canonical'] == 'NIKE':
            found_suggestion = True
            break
    # 这个测试可能需要调整，取决于具体的模糊匹配实现


def test_parsing_edge_cases():
    """测试解析边界情况"""
    extractor = ProductCodeExtractor()
    
    # 测试空输入
    assert extractor.extract_product_code("") is None
    assert extractor.extract_product_code(None) is None
    
    # 测试无有效货号
    assert extractor.extract_product_code("纯文字商品名称") is None
    
    # 品牌提取器边界情况
    brand_extractor = BrandExtractor({})
    assert brand_extractor.extract_brand("") is None
    assert brand_extractor.extract_brand(None) is None


def test_image_processor_edge_cases():
    """测试图片处理器边界情况"""
    processor = ImageProcessor()
    
    # 测试空输入
    assert processor.process_image_links("") == []
    assert processor.process_image_links(None) == []
    
    # 测试无效输入
    assert processor.process_image_links("not_a_url") == []
    assert processor.process_image_links("123456") == []
    
    # 测试序列化边界情况
    assert processor.serialize_images([]) is None
    assert processor.serialize_images(None) is None
    
    # 测试反序列化边界情况
    assert processor.deserialize_images("") == []
    assert processor.deserialize_images(None) == []
    assert processor.deserialize_images("invalid json") == []


if __name__ == '__main__':
    pytest.main([__file__, '-v'])