package com.erp.product.sku.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.erp.product.sku.dto.*;
import com.erp.product.sku.entity.*;

import java.util.List;
import java.util.Map;

/**
 * SKU匹配服务接口
 */
public interface SkuMatchService {
    
    // ==================== 查询接口 ====================
    
    /**
     * SKU匹配列表（分页）
     */
    IPage<SkuBindingDTO> listBindings(SkuMatchPageRequest request);
    
    /**
     * 未匹配商品列表（分页）
     */
    IPage<UnmatchedSkuDTO> listUnmatched(SkuMatchPageRequest request);
    
    // ==================== 绑定/解绑接口 ====================
    
    /**
     * 手动绑定 - 将平台SKU绑定到ERP SKU
     */
    SkuBindingDTO manualBind(ManualBindRequest request, Long tenantId);
    
    /**
     * 解绑SKU匹配
     */
    void unbind(Long bindingId, Long tenantId);
    
    // ==================== 规则匹配接口 ====================
    
    /**
     * 规则匹配 - 按规则自动匹配
     * 
     * 匹配规则：
     * 1. exact_code：精确匹配 - platform_product_id = erp_sku.sku_code
     * 2. exact_alias：别名匹配 - platform_product_id = erp_sku.alias  
     * 3. fuzzy_name：模糊匹配 - erp_sku.name 包含在 platform.title 中
     */
    RuleMatchResponse ruleMatch(RuleMatchRequest request, Long tenantId);
    
    // ==================== AI匹配接口 ====================
    
    /**
     * AI匹配 - 发起AI匹配任务
     * 将任务投递到Redis队列，由AI服务异步处理
     */
    SkuMatchAiTaskResponse aiMatch(AiMatchRequest request, Long tenantId);
    
    // ==================== 订单匹配接口 ====================
    
    /**
     * 订单SKU自动匹配
     * 根据订单明细中的平台SKU，自动匹配ERP SKU
     */
    OrderMatchResult matchOrderItems(Long orderId);
    
    // ==================== 内部方法 ====================
    
    /**
     * 应用匹配规则
     * @param platformSku 平台SKU
     * @param erpSkuMap ERP SKU映射表
     * @param rules 启用的规则列表
     * @return 匹配结果
     */
    MatchResult applyMatchRules(Platform platformSku, java.util.Map<String, ErpSku> erpSkuMap, List<String> rules);
    
    /**
     * 订单匹配结果
     */
    record OrderMatchResult(Long orderId, boolean allMatched, int matchedCount, int totalCount) {}
    
    /**
     * 匹配结果
     */
    record MatchResult(boolean matched, ErpSku erpSku, String rule) {}
}
