"""
条码映射处理程序
-------------
处理特殊条码的映射和转换
"""

import logging
from typing import Dict, Optional, Any

from app.core.utils.log_utils import get_logger

logger = get_logger(__name__)


class BarcodeMapper:
    """
    条码映射器：负责特殊条码的映射和处理
    """
    
    def __init__(self, special_barcodes: Dict[str, Dict[str, Any]]):
        """
        初始化条码映射器
        
        Args:
            special_barcodes: 特殊条码配置字典
        """
        self.special_barcodes = special_barcodes or {}
        
    def map_barcode(self, product: Dict[str, Any]) -> Dict[str, Any]:
        """
        映射商品条码，处理特殊情况
        
        Args:
            product: 包含条码的商品信息字典
            
        Returns:
            处理后的商品信息字典
        """
        result = product.copy()
        barcode = result.get('barcode', '')
        
        # 如果条码不在特殊条码列表中，直接返回
        if not barcode or barcode not in self.special_barcodes:
            return result
        
        special_config = self.special_barcodes[barcode]
        
        # 处理特殊倍数
        if 'multiplier' in special_config:
            multiplier = special_config.get('multiplier', 1)
            target_unit = special_config.get('target_unit', '瓶')
            
            # 数量乘以倍数
            quantity = result.get('quantity', 0)
            new_quantity = quantity * multiplier
            
            # 单价除以倍数
            price = result.get('price', 0)
            new_price = price / multiplier if price else 0
            
            # 如果有固定单价，优先使用
            if 'fixed_price' in special_config:
                new_price = special_config['fixed_price']
                logger.info(f"特殊条码({barcode})使用固定单价: {new_price}")
            
            # 如果有固定规格，设置规格
            if 'specification' in special_config:
                result['specification'] = special_config['specification']
                logger.info(f"特殊条码({barcode})使用固定规格: {special_config['specification']}")
            
            logger.info(f"特殊条码处理: {barcode}, 数量: {quantity} -> {new_quantity}, 单价: {price} -> {new_price}, 单位: {result.get('unit', '')} -> {target_unit}")
            
            result['quantity'] = new_quantity
            result['price'] = new_price
            result['unit'] = target_unit
        
        # 处理条码映射 - 放在后面以便可以同时进行特殊处理和条码映射
        if 'map_to' in special_config:
            new_barcode = special_config['map_to']
            logger.info(f"条码映射: {barcode} -> {new_barcode}")
            result['barcode'] = new_barcode
            
        return result 