
package com.tmerclub.cloud.product.service;

import com.tmerclub.cloud.common.order.vo.ShopCartItemVO;
import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO;
import com.tmerclub.cloud.product.dto.shopcart.CheckShopCartItemDTO;
import com.tmerclub.cloud.product.model.ShopCartItem;

import java.util.List;

/**
 * 购物车
 *
 * @author tmerclub
 * @date 2020-11-20 15:47:32
 */
public interface ShopCartService {

    /**
     * 根据购物车项id删除购物车
     *
     * @param shopCartItemIds 购物车项id
     * @param userId          用户id
     */
    void deleteShopCartItemsByShopCartItemIds(Long userId, List<Long> shopCartItemIds);

    /**
     * 添加购物项
     *
     * @param userId     用户id
     * @param param      购物项
     * @param priceFee   加入购物车时候的价格
     * @param categoryId 分类id
     */
    void addShopCartItem(Long userId, ChangeShopCartItemDTO param, Long priceFee, Long categoryId);

    /**
     * 更新购物项
     *
     * @param shopCartItem 购物项
     * @param userId       用户id
     */
    void updateShopCartItem(Long userId, ShopCartItem shopCartItem);

    /**
     * 清空用户购物车
     *
     * @param userId 用户id
     */
    void deleteAllShopCartItems(Long userId);

    /**
     * 获取用户所有未过期的购物项
     *
     * @return 未过期的购物项
     */
    List<ShopCartItemVO> getShopCartItems();

    /**
     * 获取已过期的购物项
     *
     * @return 已过期的购物项
     */
    List<ShopCartItemVO> getShopCartExpiryItems();

    /**
     * 购物项数量，有缓存
     *
     * @param userId 用户id
     * @return 购物项数量
     */
    Integer getShopCartItemCount(Long userId);

    /**
     * 获取被选中的购物车项
     *
     * @return 被选中的购物车项
     */
    List<ShopCartItemVO> getCheckedShopCartItems();

    /**
     * 获取被选中的购物车项
     *
     * @return 被选中的购物车项
     */
    List<ShopCartItemVO> getUserShopCartItems();


    /**
     * 商品下架 or 变成预售的时候 移除购物车商品数量缓存
     *
     * @param spuIds
     */
    void removeShopCartItemCache(List<Long> spuIds);

    /**
     * 移除供应商商品购物车数量缓存
     *
     * @param supplierSpuIds
     */
    void removeShopCartItemCacheBySupplierSpuIds(List<Long> supplierSpuIds);

    /**
     * 勾选购物车状态
     *
     * @param userId 用户id
     * @param params 参数
     */
    void checkShopCartItems(Long userId, List<CheckShopCartItemDTO> params);

    /**
     * 根据店铺id列表更新店铺是否停业状态
     *
     * @param shopIds
     * @param isClosed
     */
    void updateIsClosedByShopIds(List<Long> shopIds, Integer isClosed);

    /**
     * 批量更新购物项
     *
     * @param shopCartItem 购物项
     * @param userId       用户id
     */
    void updateShopCartItemBatch(Long userId, List<ShopCartItem> shopCartItem);

    /**
     * 根据商品id、套餐id、用户id获取购物车id
     *
     * @param spuId
     * @param comboId
     * @param userId
     * @param skuId
     * @return
     */
    Long getCartItemBySpuIdAndComboId(Long spuId, Long comboId, Long userId, Long skuId);

    /**
     * 套餐发生变化时移除用户购物车项
     *
     * @param comboIdList
     * @param spuId
     * @param skuId
     * @return
     */
    void deleteCartByComboUpdate(List<Long> comboIdList, Long spuId, Long skuId);

    /**
     * 根据套餐id和套餐商品id集合移除用户购物车项
     *
     * @param comboId
     * @param spuIdList
     */
    void deleteCartByComboIdAndSpuIdS(Long comboId, List<Long> spuIdList);

    /**
     * 根据套餐id和套餐商品skuid集合移除用户购物车项
     *
     * @param comboId
     * @param skuIdList
     */
    void deleteCartByComboIdAndSkuIdS(Long comboId, List<Long> skuIdList);

    /**
     * 修改用户购物车中的套餐商品价格
     *
     * @param comboId
     * @param skuId
     * @param price
     */
    void updateCartSpuPriceByComboIdAndSkuId(Long comboId, Long skuId, Long price);

    /**
     * 根据套餐主商品skuId获取搭配商品id
     *
     * @param skuId
     * @return
     */
    List<Long> skuIdListByComboMainSkuId(List<Long> skuId);

    /**
     * 套餐修改商品起搭数时异步修改以后购物车商品数量
     *
     * @param comboId
     * @param spuId
     * @param count
     */
    void updateCartComboCount(Long comboId, Long spuId, Integer count);
}
