
package com.tmerclub.cloud.product.service;

import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO;
import com.tmerclub.cloud.api.product.vo.SkuStockVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.product.dto.ProductSearchDTO;
import com.tmerclub.cloud.common.product.dto.SkuDTO;
import com.tmerclub.cloud.common.product.dto.SpuDTO;
import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO;
import com.tmerclub.cloud.common.product.vo.SkuAddrVO;
import com.tmerclub.cloud.common.product.vo.SkuVO;
import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO;
import com.tmerclub.cloud.common.product.vo.SpuVO;
import com.tmerclub.cloud.common.product.vo.app.SkuAppVO;
import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO;
import com.tmerclub.cloud.product.vo.SkuExcelVO;
import com.tmerclub.cloud.product.vo.SpuExcelVO;
import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO;

import java.util.List;
import java.util.Set;

/**
 * sku信息
 *
 * @author tmerclub
 * @date 2020-10-28 15:27:24
 */
public interface SkuService {

    /**
     * 获取skuVO集合
     * @param skuDTO skuDTO
     * @return skuVO集合
     */
    List<SkuVO> listSku(SkuDTO skuDTO);

    /**
     * 保存sku信息
     * @param spuId
     * @param spuStatus 商品状态
     * @param skuList
     * @param sysType
     * @param userId
     * @param shopId
     * @param spuMold
     */
    List<SkuStockVO> save(Long spuId, Integer spuStatus, List<SkuDTO> skuList, Integer sysType, Long userId, Long shopId,Integer spuMold);

    /**
     * 保存sku信息
     *
     * @param spuMold
     * @param spuId
     * @param spuStatus 商品状态
     * @param skuList
     * @param sysType
     * @param userId
     * @param shopId
     */
    void saveSkuAndStock(Integer spuMold, Long spuId, Integer spuStatus, List<SkuDTO> skuList, Integer sysType, Long userId, Long shopId);

    /**
     * 更新sku信息
     *
     * @param spu   spu信息
     * @param skuList sku列表信息
     */
    void update(SpuDTO spu, List<SkuDTO> skuList);

    /**
     * 根据sku信息id删除sku信息
     *
     * @param skuId
     */
    void deleteById(Long skuId);

    /**
     * 根据商品id获取商品中的sku列表（将会被缓存起来）
     *
     * @param spuId id
     * @return 返回sku信息
     */
    List<SkuVO> listSkuWithAttrBySpuId(Long spuId);

    /**
     * 根据spuId删除sku信息
     *
     * @param spuDTO 商品id
     */
    void deleteBySpuId(SpuDTO spuDTO);

    /**
     * 根据skuId获取sku信息
     *
     * @param skuId skuId
     * @return sku信息
     */
    SkuVO getSkuBySkuId(Long skuId);

    /**
     * 更新sku金额或者库存信息
     *
     * @param spuDTO
     */
    void updateAmountOrStock(SpuDTO spuDTO);

    /**
     * 获取商品详情需要的的sku列表（包括sku库存信息等）（仅获取启用状态）
     *
     * @param spuVO
     * @return
     */
    List<SkuAppVO> getSpuDetailSkuInfo(SpuVO spuVO);

    /**
     * 获取商品详情需要的的sku列表（包括sku库存信息等）（仅获取启用状态）
     *
     * @param spuIds
     * @return
     */
    List<SkuVO> listBySpuIds(List<Long> spuIds);

    /**
     * 获取供应商sku信息（包含供应商库存和商家库存）
     *
     * @param spuIds
     * @param shopId
     * @return
     */
    List<SkuVO> listSupplierBySpuIds(List<Long> spuIds, Long shopId);

    /**
     * 拼接sku属性信息
     *
     * @param spuSkuAttrValueList
     * @return
     */
    String spliceProperties(List<SpuSkuAttrValueVO> spuSkuAttrValueList);

    /**
     * 从缓存中获取sku的所有信息，包括attr，和库存
     *
     * @param spuId   商品id
     * @param spu
     * @param enable  是否是启用状态的sku
     * @return
     */
    List<SkuVO> listSkuAllInfoBySpuId(Long spuId, SpuVO spu, boolean enable);

    /**
     * 获取excel导出sku数据列表
     *
     * @param spuIds
     * @return
     */
    List<SpuExcelVO> excelSkuList(List<Long> spuIds);

    /**
     * 获取指定sku的价格
     *
     * @param skuIds
     * @return
     */
    List<SkuVO> listSkuPriceByIds(List<Long> skuIds);


    /**
     * 根据skuId列表获取商品订单修改地址所需信息
     *
     * @param skuIds skuId列表
     * @return sku列表
     */
    List<SkuAddrVO> listSpuDetailByIds(List<Long> skuIds);


    /**
     * 根据skuId列表获取售价最低的商品的售价
     *
     * @param skuIds
     * @return
     */
    Long getMinPriceFeeByIds(List<Long> skuIds);

    /**
     * 获取excel导出代销商品sku数据列表
     *
     * @param spuIds
     * @return
     */
    List<SupplierSpuExcelVO> excelSupplierSkuList(List<Long> spuIds);

    /**
     * 导出sku信息
     *
     * @param product
     * @return
     */
    List<SkuExcelVO> exportSkuList(ProductSearchDTO product);

    /**
     * 根据商品编码获取商品规格列表
     *
     * @param partyCodeList 商品编码
     * @return 商品信息
     */
    List<SkuVO> listByPartyCodeList(List<String> partyCodeList);

    /**
     * 获取代销商品sku
     *
     * @param spu
     * @param enable
     * @return
     */
    List<SkuVO> listConsignmentSku(SpuVO spu, boolean enable);

    /**
     * 根据商品编码和店铺Id获取sku信息
     *
     * @param partyCode
     * @param shopId
     * @param sysType
     * @return
     */
    StockBillLogItemDTO getSkuByPartyCodeAndShopId(String partyCode, Long shopId, Integer sysType);

    /**
     * 获取当前商家的所有sku编码
     *
     * @param shopId
     * @param sysType
     * @param spuId
     * @return
     */
    List<String> listSkuPartyCodesByShopId(Long shopId, Integer sysType, Long spuId);

    /**
     * 获取商品库存预警数量
     *
     * @param product 商品筛选
     * @return
     */
    Integer getStockWarningNum(ProductSearchDTO product);

    /**
     * 异步新增代销商品sku
     *
     * @param spuVO 商品信息
     * @param skuList
     * @param sysType
     */
    void commissionSave(SpuVO spuVO, List<SkuDTO> skuList, Integer sysType);

    /**
     * 根据skuId列表获取sku信息列表
     *
     * @param skuIds
     * @return
     */
    List<SkuVO> getByIds(List<Long> skuIds);

    /**
     * 获取商品sku保存到商品列表
     *
     * @param spuAdminVOList
     * @return
     */
    List<SpuAdminVO> setSpuSku(List<SpuAdminVO> spuAdminVOList);


    /**
     * 分页获取sku
     *
     * @param pageDTO
     * @param product
     * @return
     */
    PageVO<SkuVO> pageSku(PageDTO pageDTO, ProductSearchDTO product);

    /**
     * 通过skuIds获取sku信息和sku库存信息列表
     *
     * @param skuIds
     * @return
     */
    List<SkuVO> listSkuAndStockBySkuIds(List<Long> skuIds);

    /**
     * 插入sku库存
     * @param skus
     * @return
     */
    void setSkuStock(List<SkuVO> skus);

    /**
     * 插入es的sku库存
     * @param skus
     */
    void setEsSkuStock(List<SkuVO> skus);

    /**
     * 改变sku库存的状态
     * @param spuId
     * @param changeStatus
     */
    void changeSkuStockStatusBySpuId(Long spuId, Integer changeStatus);

    /**
     * 改变sku库存的状态
     * @param skuId
     * @param spuStatus 商品的状态
     * @param skuStatus sku的状态
     */
    void changeSkuStockStatusBySkuId(Long skuId, Integer spuStatus, Integer skuStatus);


    /**
     * 通过库存点id获取sku信息和sku库存信息列表
     *
     * @param stockPointId 库存点id
     * @param inStockPointId 入库库存点id
     * @return
     */
    List<SkuVO> listSkuAndStockByStockPointId(Long stockPointId,
                                              Long inStockPointId);

    /**
     * 组合商品获取所有组合的商品信息并组装,然后计算出对应库存
     * @param skus
     * @param spu
     */
    void assembleComboSpuListAndStock(List<SkuVO> skus,SpuVO spu);

    /**
     * 当前关联商品列表是否有共同供货仓库
     *
     * @param skuIds
     * @param shopId
     * @return
     */
    Boolean hasStockBySkuIds(List<Long> skuIds, Long shopId);

    /**
     * 门店切换库存模式
     * @param stockPointId
     * @param stockMode
     * @param type
     */
    void updateStockMode(Long stockPointId, Integer stockMode, Integer type);

    /**
     * 生成补充入库记录
     * @param spuId
     * @param filtePointList
     */
    void loadSeckillStockBillLogItems(Long spuId, List<StockPointSkuDTO> filtePointList);

    /**
     * 获取状态正常的规格数量
     * @param skuIds
     * @return
     */
    int countNormalSkuBySkuIds(Set<Long> skuIds);

    /**
     * 清理spu缓存
     * @param spuIdList
     */
    void removeCacheSkuWithAttrBySpuId(List<Long> spuIdList);
}
