import re

CATEGORIES = {
    'hat': 'HAT', 'gorra': 'HAT', 'sombrero': 'HAT', 'hats': 'HAT', 'gorras': 'HAT',
    'visera': 'HATV', 'visor': 'HATV',
    'vest': 'VST', 'chaleco': 'VST', 'vests': 'VST', 'chalecos': 'VST',
    'jacket': 'JCK', 'chamarra': 'JCK', 'jackets': 'JCK', 'chamarras': 'JCK', 'raincoat': 'JCK', 'impermeable': 'JCK',
    'hoodie': 'HOD', 'hoodies': 'HOD', 'sudadera': 'HOD', 'sudaderas': 'HOD', 'chumpa': 'HOD',
    'bag': 'BAG', 'bolsa': 'BAG', 'boston bag': 'BAG', 'bags': 'BAG', 'bolsas': 'BAG',
    'cover': 'COV', 'funda': 'COV', 'covers': 'COV', 'fundas': 'COV',
    'marker': 'BM', 'markers': 'BM',
    'glove': 'GLV', 'guante': 'GLV', 'gloves': 'GLV', 'guantes': 'GLV',
    'towel': 'TWL', 'toalla': 'TWL', 'towels': 'TWL', 'toallas': 'TWL',
    'tank': 'TNK', 'top': 'TNK',
    'polo': 'POL', 'polos': 'POL', 'fmg': 'POL',
    'tee': 'TSH', 't-shirt': 'TSH', 'tshirt': 'TSH', 'playera': 'TSH', 'playeras': 'TSH', 't-shirts': 'TSH', 'shirts': 'TSH', 'shirt': 'TSH', 'padel': 'TSH',
    'keyring': 'ACC', 'llavero': 'ACC', 'keyrings': 'ACC', 'llaveros': 'ACC', 'accesorios': 'ACC', 'accessories': 'ACC', 'pines': 'ACC', 'pin': 'ACC'
}

GENDERS = {
    'men': 'M', "mens": 'M', 'caballero': 'M', 'hombre': 'M',
    'women': 'W', 'dama': 'W', 'mujer': 'W',
    'kids': 'K', 'nino': 'K', 'nina': 'K', 'niño': 'K', 'niña': 'K'
}

COLORS = {
    'black': 'BLK', 'negra': 'BLK', 'negro': 'BLK',
    'white': 'WHT', 'blanca': 'WHT', 'blanco': 'WHT', 'off white': 'WHT', 'white/white': 'WHT',
    'green': 'GRN', 'verde': 'GRN', 'dark green': 'GRN',
    'blue': 'BLU', 'azul': 'BLU', 'navy': 'BLU', 'sky blue': 'BLU', 'cielo': 'BLU',
    'red': 'RED', 'roja': 'RED', 'rojo': 'RED', 'burgundy': 'RED', 'vino': 'RED',
    'grey': 'GRY', 'gris': 'GRY',
    'pink': 'PNK', 'rosa': 'PNK',
    'beige': 'BGE'
}

IGNORE_WORDS = [
    "stock", "-", "mesa", "muestra", "custom", "program", "hrs", "hazard", "rough", "society", 
    "the", "para", "gorra", "sombrero", "hat", "polo", "playera", "tee", "shirt", 
    "towel", "toalla", "buckle", "hebilla", "boton", "button", "belt", "cinturon", "outerwear"
]

def safe_extract(text, mapping_dict, default):
    """Extrae el mapeo basado en la primera ocurrencia encontrada en el texto."""
    text_lower = text.lower()
    matches = []
    for key, val in mapping_dict.items():
        found_idx = text_lower.find(key.lower())
        if found_idx != -1:
            # Validar que sea una palabra completa
            if re.search(r'\b' + re.escape(key) + r'\b', text_lower):
                matches.append((found_idx, val))
    
    # Retornar el que aparece MÁS TEMPRANO en el texto
    if matches:
        matches.sort() # Ordena por índice
        return matches[0][1]
        
    return default

def generate_sku_for_variant(product_data, variant_data, brand_prefix="HRS"):
    """
    Genera un SKU inteligente basado en la lógica de Hazard Rough Society.
    """
    title = product_data.get('title', '')
    handle = product_data.get('handle', '')
    product_type = product_data.get('product_type', '')
    tags = product_data.get('tags', '')
    
    full_text = f"{title} {handle} {product_type} {tags}".replace('-', ' ')
    
    # 1. TIPO
    tipo = safe_extract(full_text, CATEGORIES, 'ACC')
    
    # 2. GÉNERO
    genero = safe_extract(full_text, GENDERS, 'U')
    if tipo in ['BAG', 'COV', 'BM', 'TWL', 'HAT']:
        genero = 'U'
        
    # 3. COLOR
    color = 'MUL'
    # Prioridad 1: Opciones de variante
    for opt_idx in range(1, 4):
        opt_name = product_data.get(f'option{opt_idx}', '').lower()
        opt_val = variant_data.get(f'option{opt_idx}', '')
        if 'color' in opt_name:
            color = safe_extract(opt_val, COLORS, 'MUL')
            break
    
    # Prioridad 2: Texto completo (considerando 'Earliest match' en safe_extract)
    if color == 'MUL':
        # Truco: Si hay palabras como 'BUCKLE' o 'BUTTON', tratamos de buscar el color DESPUÉS de ellas
        # o simplemente confiamos en que el color dominante suele ir primero o después del accesorio.
        color = safe_extract(full_text, COLORS, 'MUL')
    
    # 4. MODELO
    words = full_text.upper().split()
    model_words = []
    
    # Lista de códigos de colores para evitar usarlos como modelo
    color_codes = set(COLORS.values())
    color_names = set(COLORS.keys())

    for w in words:
        w_clean = re.sub(r'[^A-Z0-9]', '', w)
        if not w_clean: continue
        
        lower_w = w_clean.lower()
        # Ignorar si: está en la lista de ignorados, es un color, o es el prefijo de marca
        if any(lower_w == ig for ig in IGNORE_WORDS): continue
        if lower_w in color_names: continue
        if w_clean in color_codes: continue
        if w_clean == brand_prefix: continue
        
        model_words.append(w_clean)
        if len(model_words) == 1:
            break
            
    modelo = model_words[0][:6] if model_words else "GEN"
    
    # Overrides específicos de modelos
    if modelo == 'CLUB78': modelo = 'CLUB'
    elif modelo == 'MASTERS': modelo = 'MASTER'
    
    # 5. TALLA
    size = "OS"
    for opt_idx in range(1, 4):
        opt_name = product_data.get(f'option{opt_idx}', '').lower()
        opt_val = (variant_data.get(f'option{opt_idx}') or '').strip()
        if opt_val and opt_val.lower() != 'default title':
            if any(x in opt_name for x in ['talla', 'size']):
                size = opt_val.upper()
                break
            elif 'color' not in opt_name:
                if size == 'OS':
                    size = opt_val.upper()
    
    # Limpieza de talla personalizada (Remover UNISEX)
    size_clean = size.upper().replace('UNISEX', '').strip()
    size_clean = re.sub(r'[^A-Z0-9\-]', '', size_clean)
    if not size_clean: size_clean = "OS"
    
    base_sku = f"{brand_prefix}-{tipo}-{modelo}-{genero}-{color}"
    return f"{base_sku}-{size_clean}"
    
    base_sku = f"{brand_prefix}-{tipo}-{modelo}-{genero}-{color}"
    return f"{base_sku}-{size_clean}"
