"""
颜色处理器：保持原始颜色名称，为中文颜色名添加英文参考
"""

import re
from typing import Optional, Dict, Tuple, List
from enum import Enum


class ColorProcessor:
    """颜色处理器"""
    
    def __init__(self):
        # 中文颜色到英文的对应映射
        self.chinese_to_english = {
            # 基础颜色
            '黑色': 'Black',
            '白色': 'White', 
            '红色': 'Red',
            '蓝色': 'Blue',
            '绿色': 'Green',
            '黄色': 'Yellow',
            '灰色': 'Gray',
            '粉色': 'Pink',
            '紫色': 'Purple',
            '棕色': 'Brown',
            '橙色': 'Orange',
            '银色': 'Silver',
            '金色': 'Gold',
            
            # 简化中文
            '黑': 'Black',
            '白': 'White',
            '红': 'Red', 
            '蓝': 'Blue',
            '绿': 'Green',
            '黄': 'Yellow',
            '灰': 'Gray',
            '粉': 'Pink',
            '紫': 'Purple',
            '棕': 'Brown',
            '橙': 'Orange',
            '银': 'Silver',
            '金': 'Gold',
            
            # 复合颜色
            '深蓝色': 'Dark Blue',
            '浅蓝色': 'Light Blue',
            '天蓝色': 'Sky Blue',
            '湖蓝色': 'Lake Blue',
            '藏青色': 'Navy Blue',
            '深灰色': 'Dark Gray',
            '浅灰色': 'Light Gray',
            '深绿色': 'Dark Green',
            '浅绿色': 'Light Green',
            '军绿色': 'Army Green',
            '墨绿色': 'Dark Green',
            '酒红色': 'Wine Red',
            '玫红色': 'Rose Red',
            '暗红色': 'Dark Red',
            '淡粉色': 'Light Pink',
            '米色': 'Beige',
            '卡其色': 'Khaki',
            '咖啡色': 'Coffee',
            '奶白色': 'Off White',
            '象牙色': 'Ivory',
            '香槟色': 'Champagne',
            '青色': 'Cyan',
            '橘色': 'Orange',
            '深色': 'Dark',
            '浅色': 'Light',
        }
        
        # 英文颜色标准化映射（处理各种拼写变化）
        self.english_variations = {
            # Gray/Grey 变化
            'grey': 'Gray',
            'gray': 'Gray',
            'dark grey': 'Dark Gray',
            'light grey': 'Light Gray',
            
            # 常见拼写变化
            'off-white': 'Off White',
            'offwhite': 'Off White',
            'darkblue': 'Dark Blue',
            'lightblue': 'Light Blue',
            'darkgray': 'Dark Gray',
            'lightgray': 'Light Gray',
            'darkgreen': 'Dark Green',
            'lightgreen': 'Light Green',
            
            # 品牌特有颜色名
            'nude': 'Nude',
            'beige': 'Beige',
            'cream': 'Cream',
            'ivory': 'Ivory',
            'champagne': 'Champagne',
            'rose': 'Rose',
            'burgundy': 'Burgundy',
            'wine': 'Wine',
            'navy': 'Navy',
            'coral': 'Coral',
            'mint': 'Mint',
            'sage': 'Sage',
            'lavender': 'Lavender',
            'poppy': 'Poppy',
            'camel': 'Camel',
            'tan': 'Tan',
        }
        
        # 应该保持原始形式的品牌特色颜色（通常是非标准颜色名）
        self.brand_specific_colors = {
            # 这些颜色名应该保持原样，不翻译不标准化
            'POPPY', 'SAGE', 'LAVENDER', 'CORAL', 'MINT', 'NUDE', 'CAMEL', 'TAN',
            'BURGUNDY', 'WINE', 'CHAMPAGNE', 'CREAM', 'IVORY', 'BLUSH', 'MAUVE',
            'OCHRE', 'RUST', 'COPPER', 'BRONZE', 'STEEL', 'SLATE', 'CHARCOAL',
            'PEARL', 'PLATINUM', 'ROSE GOLD', 'ANTIQUE', 'VINTAGE', 'FADED',
            # 颜色编号或代码
            'A001', 'B002', 'C003', 'NERO', 'BIANCO', 'ROSSO', 'BLU', 'VERDE'
        }
    
    def process_color(self, color_text: str) -> Optional[str]:
        """
        处理颜色文本，保持原始颜色名称，为中文添加英文参考
        
        Args:
            color_text: 原始颜色文本
            
        Returns:
            处理后的颜色文本
        """
        if not color_text or not color_text.strip():
            return None
            
        color = color_text.strip()
        
        # 1. 如果是品牌特色颜色，直接返回（保持原样）
        if color.upper() in self.brand_specific_colors:
            return color
        
        # 2. 如果包含颜色代码（通常是字母+数字组合），保持原样
        if self._is_color_code(color):
            return color
            
        # 3. 如果是纯中文颜色名，添加英文参考
        if self._is_chinese_color(color):
            english_ref = self.chinese_to_english.get(color)
            if english_ref:
                return f"{color} ({english_ref})"
            else:
                # 如果没有对应的英文，保持原中文
                return color
        
        # 4. 如果是英文颜色名，进行标准化但保持英文
        if self._is_english_color(color):
            return self._normalize_english_color(color)
        
        # 5. 混合颜色处理（如：黑色Black、白色WHITE等）
        mixed_result = self._process_mixed_color(color)
        if mixed_result:
            return mixed_result
            
        # 6. 如果都不匹配，保持原样
        return color
    
    def _is_color_code(self, color: str) -> bool:
        """判断是否为颜色代码"""
        # 颜色代码通常是字母数字组合，如 A001, B2B2B2, #FF0000 等
        if re.match(r'^[A-Z]\d+$', color.upper()):  # A001 格式
            return True
        if re.match(r'^#[0-9A-F]{6}$', color.upper()):  # 十六进制颜色代码
            return True  
        if re.match(r'^[0-9A-F]{6}$', color.upper()):  # 不带#的十六进制
            return True
        if len(color) <= 4 and re.match(r'^[A-Z0-9]+$', color.upper()):  # 短代码如 B01
            return True
        return False
    
    def _is_chinese_color(self, color: str) -> bool:
        """判断是否为纯中文颜色名"""
        # 检查是否包含中文字符且是已知的中文颜色
        has_chinese = bool(re.search(r'[\u4e00-\u9fff]', color))
        if not has_chinese:
            return False
            
        # 如果包含英文字母，说明是混合的，不是纯中文
        if re.search(r'[A-Za-z]', color):
            return False
            
        # 检查是否在中文颜色列表中
        return color in self.chinese_to_english
    
    def _is_english_color(self, color: str) -> bool:
        """判断是否为英文颜色名"""
        # 只包含英文字母、空格、连字符
        if not re.match(r'^[A-Za-z\s\-]+$', color):
            return False
            
        # 检查是否是常见的英文颜色词
        color_lower = color.lower().strip()
        common_colors = [
            'black', 'white', 'red', 'blue', 'green', 'yellow', 'gray', 'grey',
            'pink', 'purple', 'brown', 'orange', 'silver', 'gold', 'navy',
            'beige', 'cream', 'ivory', 'champagne', 'coral', 'mint', 'sage',
            'lavender', 'poppy', 'rose', 'burgundy', 'wine', 'khaki', 'camel',
            'tan', 'nude', 'dark', 'light', 'off', 'off-white', 'offwhite'
        ]
        
        words = color_lower.split()
        # 检查单词或整体是否匹配
        return any(word in common_colors for word in words) or color_lower in common_colors
    
    def _normalize_english_color(self, color: str) -> str:
        """标准化英文颜色名"""
        color_lower = color.lower().strip()
        
        # 检查是否有标准化映射
        if color_lower in self.english_variations:
            return self.english_variations[color_lower]
        
        # 标准化首字母大写
        if ' ' in color:
            # 多个单词，每个单词首字母大写
            return ' '.join(word.capitalize() for word in color.split())
        else:
            # 单个单词，首字母大写
            return color.capitalize()
    
    def _process_mixed_color(self, color: str) -> Optional[str]:
        """处理混合颜色（中英混合）"""
        # 匹配类似 "黑色Black"、"白色WHITE"、"Black黑色" 等格式
        
        # 模式1: 中文+英文 (如: 黑色Black)
        match1 = re.match(r'^([\u4e00-\u9fff]+)\s*([A-Za-z]+)$', color)
        if match1:
            chinese_part = match1.group(1)
            english_part = match1.group(2)
            
            # 验证中文部分是否为颜色
            if chinese_part in self.chinese_to_english:
                # 优先保持原始格式，只标准化英文部分
                standardized_english = self._normalize_english_color(english_part)
                return f"{chinese_part} ({standardized_english})"
        
        # 模式2: 英文+中文 (如: Black黑色)
        match2 = re.match(r'^([A-Za-z]+)\s*([\u4e00-\u9fff]+)$', color)
        if match2:
            english_part = match2.group(1)
            chinese_part = match2.group(2)
            
            # 验证中文部分是否为颜色
            if chinese_part in self.chinese_to_english:
                # 保持"中文 (英文)"的统一格式
                standardized_english = self._normalize_english_color(english_part)
                return f"{chinese_part} ({standardized_english})"
        
        # 模式3: 处理如"深蓝Navy"这样的组合 - 需要更智能的匹配
        match3 = re.match(r'^([\u4e00-\u9fff]{2,})\s*([A-Za-z]+)$', color)
        if match3:
            chinese_part = match3.group(1)
            english_part = match3.group(2)
            
            # 检查中文部分是否为颜色（包括复合颜色）
            if chinese_part in self.chinese_to_english:
                standardized_english = self._normalize_english_color(english_part)
                return f"{chinese_part} ({standardized_english})"
            else:
                # 尝试寻找中文中的颜色词
                for cn_color in self.chinese_to_english.keys():
                    if cn_color in chinese_part and len(cn_color) >= 2:  # 至少2个字符的颜色词
                        # 如果英文部分也是颜色词，则组合
                        if self._is_english_color(english_part):
                            standardized_english = self._normalize_english_color(english_part)
                            return f"{chinese_part} ({standardized_english})"
        
        return None
    
    def extract_color_from_text(self, text: str) -> Optional[str]:
        """
        从文本中提取颜色信息
        
        Args:
            text: 包含颜色信息的文本
            
        Returns:
            提取的颜色，经过处理
        """
        if not text:
            return None
            
        # 1. 优先提取结构化颜色信息（如销售属性中的颜色）
        structured_color = self._extract_structured_color(text)
        if structured_color:
            return self.process_color(structured_color)
        
        # 2. 从方括号中提取颜色
        bracket_colors = self._extract_bracket_colors(text)
        if bracket_colors:
            return self.process_color(bracket_colors[0])
        
        # 3. 从文本中搜索颜色关键词
        color_keywords = self._find_color_keywords(text)
        if color_keywords:
            return self.process_color(color_keywords[0])
        
        return None
    
    def _extract_structured_color(self, text: str) -> Optional[str]:
        """提取结构化的颜色信息"""
        # 匹配如 "颜色:黑色"、"Color:Black" 等格式
        patterns = [
            r'(?:颜色|Color|colour)[：:=]\s*([^,;，；\s]+)',
            r'(?:色|色彩)[：:=]\s*([^,;，；\s]+)',
        ]
        
        for pattern in patterns:
            matches = re.findall(pattern, text, re.IGNORECASE)
            if matches:
                return matches[0].strip()
        
        # 匹配销售属性格式：颜色_尺寸
        attr_match = re.search(r'([^_\s]+)_[^_\s]+', text)
        if attr_match:
            potential_color = attr_match.group(1).strip()
            # 验证是否为颜色词
            if self._is_likely_color(potential_color):
                return potential_color
                
        return None
    
    def _extract_bracket_colors(self, text: str) -> List[str]:
        """从方括号中提取颜色"""
        colors = []
        bracket_pattern = r'\[([^\[\]]*)\]'
        brackets = re.findall(bracket_pattern, text)
        
        for bracket_content in brackets:
            content = bracket_content.strip()
            if self._is_likely_color(content):
                colors.append(content)
                
        return colors
    
    def _find_color_keywords(self, text: str) -> List[str]:
        """在文本中查找颜色关键词"""
        colors = []
        
        # 中文颜色词
        for chinese_color in self.chinese_to_english.keys():
            if chinese_color in text:
                colors.append(chinese_color)
        
        # 英文颜色词
        text_lower = text.lower()
        for english_color in self.english_variations.keys():
            if english_color in text_lower:
                colors.append(english_color)
        
        # 品牌特色颜色
        text_upper = text.upper()
        for brand_color in self.brand_specific_colors:
            if brand_color in text_upper:
                colors.append(brand_color)
        
        return colors
    
    def _is_likely_color(self, word: str) -> bool:
        """判断词汇是否可能是颜色"""
        if not word:
            return False
            
        # 中文颜色
        if word in self.chinese_to_english:
            return True
            
        # 英文颜色
        word_lower = word.lower()
        if word_lower in self.english_variations:
            return True
            
        # 品牌颜色
        if word.upper() in self.brand_specific_colors:
            return True
            
        # 颜色代码
        if self._is_color_code(word):
            return True
            
        # 常见英文颜色词检查
        common_color_words = [
            'black', 'white', 'red', 'blue', 'green', 'yellow', 'gray', 'grey',
            'pink', 'purple', 'brown', 'orange', 'silver', 'gold', 'navy',
            'beige', 'cream', 'ivory', 'champagne', 'coral', 'mint', 'sage',
            'lavender', 'poppy', 'rose', 'burgundy', 'wine', 'khaki', 'camel',
            'tan', 'nude'
        ]
        
        return word_lower in common_color_words


# 全局颜色处理器实例
color_processor = ColorProcessor()


def process_color_attribute(color_text: str) -> Optional[str]:
    """
    处理颜色属性的便捷函数
    
    Args:
        color_text: 原始颜色文本
        
    Returns:
        处理后的颜色文本
    """
    return color_processor.process_color(color_text)


def extract_color_from_product_info(product_name: str, sales_attrs: str = "") -> Optional[str]:
    """
    从产品信息中提取颜色的便捷函数
    
    Args:
        product_name: 产品名称
        sales_attrs: 销售属性
        
    Returns:
        提取的颜色
    """
    combined_text = f"{product_name} {sales_attrs}".strip()
    return color_processor.extract_color_from_text(combined_text)


if __name__ == "__main__":
    # 测试用例
    processor = ColorProcessor()
    
    test_cases = [
        "黑色",          # 应该输出: 黑色 (Black)
        "Black",         # 应该输出: Black  
        "黑色Black",     # 应该输出: 黑色 (Black)
        "POPPY",         # 应该输出: POPPY (保持原样)
        "深蓝色",        # 应该输出: 深蓝色 (Dark Blue)
        "Navy Blue",     # 应该输出: Navy Blue
        "A001",          # 应该输出: A001 (颜色代码)
        "红",            # 应该输出: 红 (Red)
        "grey",          # 应该输出: Gray
        "off-white",     # 应该输出: Off White
    ]
    
    print("颜色处理测试结果:")
    for test_color in test_cases:
        result = processor.process_color(test_color)
        print(f"{test_color:15} -> {result}")