package com.ycwl.basic.pricing.service;

import com.github.pagehelper.PageInfo;
import com.ycwl.basic.pricing.dto.PricingFilterRequest;
import com.ycwl.basic.pricing.dto.TierConfigFilterRequest;
import com.ycwl.basic.pricing.entity.PriceProductConfig;
import com.ycwl.basic.pricing.entity.PriceTierConfig;

import java.util.List;

/**
 * 商品配置管理服务接口
 */
public interface IProductConfigService {
    
    /**
     * 根据商品类型获取基础配置（兼容旧接口）
     * 
     * @param productType 商品类型
     * @return 商品配置列表
     */
    List<PriceProductConfig> getProductConfig(String productType);
    
    /**
     * 根据商品类型和商品ID获取精确配置
     *
     * @param productType 商品类型
     * @param productId 具体商品ID
     * @return 商品配置
     */
    PriceProductConfig getProductConfig(String productType, String productId);

    /**
     * 根据商品类型、商品ID和景区ID获取精确配置（支持景区维度的优惠策略控制）
     *
     * 查询优先级：
     * 1. 景区+商品ID: (productType, productId, scenicId)
     * 2. 景区+默认: (productType, "default", scenicId)
     * 3. 全局+商品ID: (productType, productId, null)
     * 4. 全局+默认: (productType, "default", null)
     *
     * @param productType 商品类型
     * @param productId 具体商品ID
     * @param scenicId 景区ID
     * @return 商品配置（包含优惠策略控制字段）
     */
    PriceProductConfig getProductConfig(String productType, String productId, Long scenicId);

    /**
     * 根据商品类型、商品ID和数量获取阶梯价格配置
     *
     * @param productType 商品类型
     * @param productId 具体商品ID
     * @param quantity 数量
     * @return 阶梯价格配置
     */
    PriceTierConfig getTierConfig(String productType, String productId, Integer quantity);

    /**
     * 根据商品类型、商品ID、数量和景区ID获取阶梯价格配置（支持景区维度）
     *
     * 查询优先级：
     * 1. 景区+商品ID: (productType, productId, quantity, scenicId)
     * 2. 景区+默认: (productType, "default", quantity, scenicId)
     * 3. 全局+商品ID: (productType, productId, quantity, null)
     * 4. 全局+默认: (productType, "default", quantity, null)
     *
     * @param productType 商品类型
     * @param productId 具体商品ID
     * @param quantity 数量
     * @param scenicId 景区ID
     * @return 阶梯价格配置
     */
    PriceTierConfig getTierConfig(String productType, String productId, Integer quantity, Long scenicId);
    
    /**
     * 获取所有启用的商品配置
     * 
     * @return 商品配置列表
     */
    List<PriceProductConfig> getActiveProductConfigs();
    
    /**
     * 获取所有商品配置（仅启用的）
     * 
     * @return 商品配置列表
     */
    List<PriceProductConfig> getAllProductConfigs();
    
    /**
     * 根据商品类型获取所有阶梯配置
     * 
     * @param productType 商品类型
     * @return 阶梯配置列表
     */
    List<PriceTierConfig> getTierConfigs(String productType);
    
    /**
     * 根据商品类型和商品ID获取所有阶梯配置
     * 
     * @param productType 商品类型
     * @param productId 具体商品ID
     * @return 阶梯配置列表
     */
    List<PriceTierConfig> getTierConfigs(String productType, String productId);
    
    /**
     * 获取所有启用的阶梯配置
     * 
     * @return 阶梯配置列表
     */
    List<PriceTierConfig> getAllTierConfigs();
    
    // ==================== 管理端接口（包含禁用的配置） ====================
    
    /**
     * 获取所有商品配置（包含禁用的）- 管理端使用
     * 
     * @return 商品配置列表
     */
    List<PriceProductConfig> getAllProductConfigsForAdmin();
    
    /**
     * 获取所有阶梯配置（包含禁用的）- 管理端使用
     * 
     * @return 阶梯配置列表
     */
    List<PriceTierConfig> getAllTierConfigsForAdmin();
    
    /**
     * 根据商品类型获取所有阶梯配置（包含禁用的）- 管理端使用
     * 
     * @param productType 商品类型
     * @return 阶梯配置列表
     */
    List<PriceTierConfig> getTierConfigsForAdmin(String productType);
    
    /**
     * 根据商品类型和商品ID获取所有阶梯配置（包含禁用的）- 管理端使用
     * 
     * @param productType 商品类型
     * @param productId 具体商品ID
     * @return 阶梯配置列表
     */
    List<PriceTierConfig> getTierConfigsForAdmin(String productType, String productId);
    
    /**
     * 分页查询商品配置（包含禁用的）- 管理端使用
     * 
     * @param request 筛选请求参数
     * @return 分页结果
     */
    PageInfo<PriceProductConfig> pageProductConfigsForAdmin(PricingFilterRequest request);
    
    /**
     * 分页查询阶梯配置（包含禁用的）- 管理端使用
     * 
     * @param request 筛选请求参数
     * @return 分页结果
     */
    PageInfo<PriceTierConfig> pageTierConfigsForAdmin(TierConfigFilterRequest request);
}