
package com.tmerclub.cloud.combo.service;

import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.product.dto.ComboDTO;
import com.tmerclub.cloud.common.product.vo.ComboVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 商品套餐
 *
 * @author tmerclub
 * @date 2022-08-16 09:18:06
 */
public interface ComboService {

    /**
     * 分页获取商品套餐列表
     * @param pageDTO
     * @param comboDTO
     * @return
     */
    PageVO<ComboVO> page(PageDTO pageDTO, ComboDTO comboDTO);

    /**
     * 根据商品套餐id获取商品套餐
     * @param comboId
     * @param sysType
     * @return
     */
    ComboVO getByComboId(Long comboId, Integer sysType);

    /**
     * 根据商品套餐id获取商品套餐
     * @param comboId
     * @return
     */
    ComboVO getComboInfoByComboId(Long comboId);

    /**
     * 获取套餐信息
     * @param comboDTO
     * @param sysType
     * @return
     */
    ComboVO pcGetCombo(ComboDTO comboDTO, Integer sysType);

    /**
     * 保存商品套餐
     *
     * @param comboDTO 商品套餐
     */
    void save(ComboDTO comboDTO);

    /**
     * 更新商品套餐
     *
     * @param comboDTO 商品套餐
     */
    void update(ComboDTO comboDTO);

    /**
     * 修改商品套餐状态
     *
     * @param comboId
     * @param status
     */
    void updateComboStatus(Long comboId, Integer status);

    /**
     * 根据商品id获取套餐信息
     *
     * @param spuId
     * @return
     */
    List<ComboVO> comboVoListBySpuId(Long spuId);

    /**
     * 根据spuId获取相关的套餐信息
     *
     * @param shopId
     * @param spuId
     * @return
     */
    List<ComboVO> listComboInfoBySpuId(Long shopId, Long spuId);

    /**
     * 定时任务  套餐活动结束，修改套餐状态、套餐商品项状态、套餐商品sku项状态
     */
    void comboEndOperation();

    /**
     * 定时任务 开启 到了活动开始时间未开启的套餐
     */
    void enableCombo();

    /**
     * 套餐销量增加
     *
     * @param combo
     */
    void comboSoldNumAdd(List<ComboDTO> combo);

    /**
     * 商品下架时如果商品在套餐活动中且为主商品则失效套餐活动
     *
     * @param spuId
     */
    void offComboMainSpu(Long spuId);

    /**
     * 检查商品是否为套餐活动（状态正在进行中的）的商品
     *
     * @param spuId
     * @param shopId
     * @return
     */
    Boolean checkComboSpu(Long spuId, Long shopId);

    /**
     * 根据套餐id集合检查套餐是否全部可用
     *
     * @param comboIdList
     * @return 返回不可用套餐数量 0代表全部可用，其它数据代表有不可用的套餐
     */
    Integer checkComboIsUsable(List<Long> comboIdList);

    /**
     * 根据商品id清除缓存
     *
     * @param spuId
     */
    void removeComboSpuCache(Long spuId);

    /**
     * 根据套餐id集合获取套餐信息
     * @param comboIdList
     * @return
     */
    List<ComboVO> getComboByComboIdList(@Param("comboIdList") List<Long> comboIdList);
}
