
package com.tmerclub.cloud.seckill.service;

import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO;
import com.tmerclub.cloud.seckill.vo.SeckillSkuVO;
import com.tmerclub.cloud.seckill.vo.SeckillVO;

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

/**
 * 秒杀活动sku
 *
 * @author lhd
 * @date 2021-03-30 14:53:09
 */
public interface SeckillSkuService {

    /**
     * 根据秒杀活动skuid获取秒杀活动sku
     *
     * @param seckillSkuId 秒杀活动skuid
     * @return 秒杀活动sku
     */
    SeckillSkuVO getBySeckillSkuId(Long seckillSkuId);

    /**
     * 根据秒杀活动id获取秒杀商品规格信息
     * @param seckillId 秒杀活动id
     * @return 秒杀商品规格信息
     */
    List<SeckillSkuVO> listSeckillSkuBySeckillId(Long seckillId);

    /**
     * 批量保存秒杀活动sku
     * @param seckillSkuList 秒杀活动sku
     */
    void saveBatch(List<SeckillSkuDTO> seckillSkuList);

    /**
     * 清除秒杀sku信息
     * @param seckillId 秒杀id
     */
    void removeSeckillSkuCacheBySeckillId(Long seckillId);

    /**
     * 缓存分片信息
     * @param seckillSkuId
     * @param totalStock
     * @return availableZone
     */
    Integer doZone(Long seckillSkuId, Integer totalStock);

    /**
     * 根据秒杀skuId从redis获取库存
     * @param activityId
     * @param skuId
     * @return
     */
    Integer getStockBySeckillSkuId(Long activityId,Long skuId);

    /**
     * 根据秒杀skuId从redis获取库存
     * @param activityId
     * @param skuId
     * @param stockPointIds
     * @return
     */
    Map<Long, Integer> getPointStockBySeckillSkuId(Long activityId, Long skuId, List<Long> stockPointIds);

    /**
     * 根据秒杀Id从redis获取库存
     * @param seckillId
     * @return
     */
    Integer getStockBySeckillId(Long seckillId);

    /**
     * 获取可能需要落库的秒杀活动
     * @return 秒杀信息
     */
    List<SeckillSkuVO> listMaybeNeedStockPlacementActivity();

    /**
     * 库存落库将缓存中的库存写入到数据库中
     * @param seckillSkuId
     * @param seckillId
     */
    void flushStockToDb(Long seckillSkuId, Long seckillId);

    /**
     * 获取刚刚结束的秒杀活动
     * @return
     */
    List<SeckillSkuVO> listOverJustNow();

    /**
     * 回退秒杀库存
     *
     * @param activityId
     * @param skuId
     * @param count
     * @param orderId
     * @param userId
     * @param stockPointId
     */
    void rollbackSecKillStock(Long activityId,
                              Long skuId,
                              Integer count, Long orderId, Long userId, Long stockPointId);

    /**
     * 从redis补充库存
     * @param seckill
     * @return
     */
    void handSeckillPointSku(SeckillVO seckill);

    /**
     * 初始化秒杀区域库存
     */
    void initPointSeckillStock();

}
