
package com.tmerclub.cloud.api.product.feign;

import com.tmerclub.cloud.api.product.bo.SpuSimpleBO;
import com.tmerclub.cloud.common.product.bo.EsProductBO;
import com.tmerclub.cloud.common.product.dto.SpuDTO;
import com.tmerclub.cloud.common.product.vo.*;
import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO;
import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO;
import com.tmerclub.cloud.common.response.ServerResponseEntity;

import java.util.List;

/**
 * @author tmerclub
 * @date 2020/11/12
 */
public interface SpuFeignClient {

    /**
     * 通过spuId需要搜索的商品
     *
     * @param spuId spuid
     * @return 商品信息(spuId, name, mainImgUrl)
     */
    ServerResponseEntity<SpuVO> getById(Long spuId);

    /**
     * 通过spuId需要搜索的商品
     *
     * @param spuId spuid
     * @return 商品信息(spuId, name, mainImgUrl)
     */
    ServerResponseEntity<SpuVO> getDetailById(Long spuId);

    /**
     * 通过spuId需要搜索的商品
     *
     * @param spuId       spuId
     * @param skuId       skuId
     * @param supplierSpu 是否供应商商品
     * @return 商品信息
     */
    ServerResponseEntity<SpuAndSkuVO> getSpuAndSkuAndRateById(Long spuId, Long skuId, Boolean supplierSpu);

    /**
     * 根据店铺id或者商品id或者为空直接获取可以参与秒杀活动的商品列表
     *
     * @param spuId  spuId
     * @param shopId 店铺id
     * @return 商品信息
     */
    ServerResponseEntity<List<SpuVO>> listCanSeckillProd(Long spuId,
                                                         Long shopId);

    /**
     * 根据商品编码获取商品列表
     *
     * @param partyCodeList 商品编码
     * @param shopId
     * @return 商品信息
     */
    ServerResponseEntity<List<PurchaseSpuVO>> listPurchaseSpuByPartyCodeList(List<String> partyCodeList,
                                                                             Long shopId);

    /**
     * 获取商品活动信息
     *
     * @param shopId
     * @param spuId
     * @return
     */
    ServerResponseEntity<SpuActivityAppVO> spuActivityBySpuId(Long shopId, Long spuId);

    /**
     * 下线spu
     *
     * @param shopId
     * @return
     */
    ServerResponseEntity<Void> offlineSpuByShopId(Long shopId);

    /**
     * 根据店铺id下线店铺商品（批量）
     *
     * @param shopIds 店铺id集合
     * @return
     */
    ServerResponseEntity<Void> offlineSpuByShopIds(List<Long> shopIds);

    /**
     * 根据供应商Id下线供应商店铺的商品
     *
     * @param supplierId
     * @return
     */
    ServerResponseEntity<Void> offlineSpuBySupplierId(Long supplierId);

    /**
     * 获取spu和sku信息, 包含了商品的库存和销量
     *
     * @param spuId
     * @return
     */
    ServerResponseEntity<SpuVO> getSpuAndSkuBySpuId(Long spuId);

    /**
     * 更新商品类型
     *
     * @param spuDTO
     * @return
     */
    ServerResponseEntity<Void> changeSpuType(SpuDTO spuDTO);

    /**
     * 根据运费id获取商品数量
     *
     * @param transportId
     * @return
     */
    ServerResponseEntity<Integer> countByTransportId(Long transportId);

    /**
     * 删除商品活动缓存
     *
     * @param shopId null:代表所有的店铺  not null: 指定到具体店铺（若不指定spuIds,则按店铺、平台清除商品的缓存）
     * @param spuIds 商品id列表不为空代表有指定删除缓存的商品列表，就不进行全店铺/平台的商品缓存清除
     */
    void removeSpuActivityCache(Long shopId, List<Long> spuIds);

    /**
     * 将商品变为普通商品
     *
     * @param spuIds 商品id
     */
    void changeToNormalSpu(List<Long> spuIds);

    /**
     * 根据用户id查询商品收藏数量
     *
     * @param userId 用户id
     * @return 商品收藏数量
     */
    ServerResponseEntity<Integer> countByUserId(Long userId);

    /**
     * 根据商品id列表获取商品名称列表
     *
     * @param spuIds
     * @return
     */
    ServerResponseEntity<List<SpuVO>> listSpuNameBySpuIds(List<Long> spuIds);

    /**
     * 根据商品id列表获取商品列表
     *
     * @param spuIds
     * @return
     */
    ServerResponseEntity<List<SpuVO>> listSpuBySpuIds(List<Long> spuIds);

    /**
     * 根据店铺id列表更新商品更新时间
     *
     * @param shopIds
     * @param sysType
     * @return
     */
    ServerResponseEntity<Void> updateSpuUpdateTimeByShopIds(List<Long> shopIds, Integer sysType);

    /**
     * 更新商品更新时间
     *
     * @param spuIds
     * @return
     */
    void updateSpuUpdateTimeBySpuIds(List<Long> spuIds);

    /**
     * 失效商品活动信息，不需要下架商品
     *
     * @param shopIds
     * @return
     */
    ServerResponseEntity<Void> offlineSpuActivityByShopIds(List<Long> shopIds);

    /**
     * 根据基本信息查询商品列表
     *
     * @param spuSimpleBO
     * @return
     */
    ServerResponseEntity<List<SpuSimpleBO>> listSimple(SpuSimpleBO spuSimpleBO);

    /**
     * 根据基本信息查询商品列表（包括删除商品）
     *
     * @param spuSimpleBO
     * @return
     */
    ServerResponseEntity<List<SpuSimpleBO>> listSimples(SpuSimpleBO spuSimpleBO);


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

    /**
     * 根据店铺id获取所有商品id
     *
     * @param shopId
     * @return
     */
    ServerResponseEntity<List<Long>> listSpuIdsByShopId(Long shopId);

    /**
     * 根据spuIds校验状态
     *
     * @param spuIds
     * @return
     */
    ServerResponseEntity<?> checkSpuStatus(List<Long> spuIds);

    /**
     * 根据供应商id和商品规格id获取商品信息
     *
     * @param skuList    商品规格
     * @param supplierId 供应商id
     * @return 商品信息
     */
    ServerResponseEntity<List<SpuAndSkuVO>> listSpuAndSkuById(List<SkuVO> skuList, Long supplierId);

    /**
     * 根据店铺id和供应商商品id判断店铺是否代销了
     *
     * @param spuAdminVOList
     * @param shopId
     * @return
     */
    ServerResponseEntity<List<SpuAdminVO>> isCommissionByShopIdAndSpuId(List<SpuAdminVO> spuAdminVOList, Long shopId);

    /**
     * 供应商修改供货价时修改代销商品价格
     *
     * @param supplierSpuId
     * @param price
     * @param marketPriceFee
     */
    void soldOutSpuBySpu(Long supplierSpuId, Long price, Long marketPriceFee);

    /**
     * 供应商改变供应商品状态时代销商品同步状态
     *
     * @param supplierSpuId
     * @param status
     */
    void supplierUpdateSpuStatus(Long supplierSpuId, Integer status);

    /**
     * 获取代销商品 供应商商品更新后代销商品是否已同步更新 值
     *
     * @param spuIds
     * @return
     */
    ServerResponseEntity<List<SpuVO>> getSpuIsSynUpdate(List<Long> spuIds);

    /**
     * 供应商商品变更后对应下架不同类型的代销商品
     *
     * @param supplierSpuId
     * @param commissionSpuOffType
     * @return
     */
    ServerResponseEntity<Void> supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType);

    /**
     * 供货价发生变化、sku种类增加，商家是手动设价，下架商家的商品
     *
     * @param supplierSpuId
     */
    void skuUpdateLaterOperate(Long supplierSpuId);

    /**
     * 验证 当商家设置了手动设价--供货价高于售价自动下架商品 发布的商品售价是否低于供货价 低于就下架代销商品
     *
     * @param esProductBO
     * @return
     */
    ServerResponseEntity<Void> feePriceUnderSupplyPrice(EsProductBO esProductBO);


    /**
     * 供应商变更了商品信息，下架手动设价的代销商品
     *
     * @param supplierSpuId
     * @param isFiltration
     * @param type
     */
    void soldOutManualPriceCommissionSpu(Long supplierSpuId, Integer type, Integer isFiltration);

    /**
     * 供应商品sku增加或者删除处理代销商品sku
     *
     * @param supplierSpuId
     * @param skuId
     */
    void supplierSkuAddOrDeleteLaterOperate(Long supplierSpuId, Long skuId);

    /**
     * change
     * @param supplierSpuId
     */
    void changeSynUpdate(Long supplierSpuId);

    /**
     * 商家修改代销设置，更新已导入的代销商品价格
     *
     * @param shopId
     */
    void updateManualPriceCommissionSpuPrice(Long shopId);

    /**
     * 商家端获取商品信息列表时 检查代销商品基本信息是否改变，如果改变了显示商家自己商品信息，没有改变则显示供应商信息
     *
     * @param spuAdminVOList
     * @return
     */
    ServerResponseEntity<List<SpuAdminVO>> checkCommissionSpuIsUpdateMsg(List<SpuAdminVO> spuAdminVOList);

    /**
     * 商家端获取商品信息列表时 检查代销商品基本信息是否改变，如果改变了显示商家自己商品信息，没有改变则显示供应商信息
     *
     * @param productSearchVOList
     * @return
     */
    ServerResponseEntity<List<ProductSearchVO>> usCheckCommissionSpuIsUpdateMsg(List<ProductSearchVO> productSearchVOList);

    /**
     * 秒杀支付成功后，更新商品的销量
     *
     * @param spuId
     * @param prodCount
     */
    void updateSaleNumBySeckillOrder(Long spuId, Integer prodCount);

    /**
     * 根据商品id列表获取商品列表(无需授权）
     *
     * @param spuIds
     * @return
     */
    ServerResponseEntity<List<SpuVO>> listSpuBySpuIdsNo(List<Long> spuIds);

    /**
     * 根据spuIds获取商品信息
     *
     * @param spuIdS
     * @return mainImgUrl
     */
    ServerResponseEntity<List<SpuVO>> getDetailBySpuIds(List<Long> spuIdS);

    /**
     * 根据供应商id列表下架商品
     *
     * @param supplierIdsToStop
     * @return
     */
    ServerResponseEntity<Void> batchChangeSpuStatusToDisableBySupplierIds(List<Long> supplierIdsToStop);

    /**
     * 供应商品更新品牌或者排序时,同步更新代销商品的品牌或排序
     *
     * @param brandId
     * @param seq
     * @param supplierSpuId
     */
    void syncUpdateCommissionSpuBrandOrSeq(Long brandId, Integer seq,
                                           Long supplierSpuId);


    /**
     * 添加采购订单时未导入的供应商品自动导入
     *
     * @param spuVOList
     * @param sysType
     * @param userId
     * @return
     */
    ServerResponseEntity<Void> voluntarilyImportSupplierSpu(List<SpuVO> spuVOList, Integer sysType,
                                                            Long userId);

    /**
     * 根据店铺id更新商品
     * @param shopId 店铺id
     * @param sysType 系统类型
     * @return
     */
    ServerResponseEntity<Void> updateSpuByShopId(Long shopId,Integer sysType);

    /**
     * 新增供应商sku时，更新代销商品的数据
     * @param spuId
     * @param skuId
     */
    void processSupplierSkuInsert(Long spuId, Long skuId);

    /**
     *  获取店铺中指定供应商商品的代销商品列表
     * @param supplierSpuIds
     * @return
     */
    List<SpuVO> listShopSpuBySupplierSpuIds(Long shopId, List<Long> supplierSpuIds);
}
