
package com.tmerclub.cloud.product.mapper;

import com.tmerclub.cloud.common.order.vo.ShopCartItemVO;
import com.tmerclub.cloud.product.dto.shopcart.CheckShopCartItemDTO;
import com.tmerclub.cloud.product.model.ShopCartItem;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 购物车
 *
 * @author tmerclub
 * @date 2020-11-21 10:01:23
 */
public interface ShopCartItemMapper {

    /**
     * 根据购物车id获取购物车
     *
     * @param cartItemId 购物车id
     * @return 购物车
     */
    ShopCartItemVO getByCartId(@Param("cartItemId") Long cartItemId);

    /**
     * 保存购物车
     *
     * @param shopCartItem 购物车
     */
    void save(@Param("shopCartItem") ShopCartItem shopCartItem);

    /**
     * 更新购物车
     *
     * @param shopCartItem 购物车
     */
    void update(@Param("shopCartItem") ShopCartItem shopCartItem);

    /**
     * 根据用户id获取用户的购物车信息
     *
     * @param userId    用户id
     * @param isExpiry  是否已过期
     * @param isChecked 是否被选中
     * @param lang      语言
     * @return 购物车项
     */
    List<ShopCartItemVO> getShopCartItems(@Param("userId") Long userId, @Param("isExpiry") Boolean isExpiry, @Param("isChecked") Boolean isChecked, @Param("lang") Integer lang);


    /**
     * 获取用户选中的购物车信息
     *
     * @param userId    用户id
     * @return 购物车项
     */
    List<ShopCartItemVO> getUserShopCartItems(Long userId);

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

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

    /**
     * 根据商品id，获取用户id，用于清空购物车商品数量的缓存
     *
     * @param spuIds 商品ids
     * @return 用户id列表
     */
    List<String> listUserIdBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 根据供应商商品id，获取用户id，用于清空购物车商品数量的缓存
     *
     * @param supplierSpuIds
     * @return
     */
    List<String> listUserIdBySupplierSpuIds(@Param("supplierSpuIds") List<Long> supplierSpuIds);

    /**
     * 根据套餐id，获取用户id，用于清空购物车商品数量的缓存
     *
     * @param comboIds
     * @return
     */
    List<String> listUserIdByComboIds(@Param("comboIds") List<Long> comboIds);

    /**
     * 根据商品id，获取用户id，用于清空购物车商品数量的缓存
     *
     * @param skuIds 商品SKUids
     * @return 用户id列表
     */
    List<String> listUserIdBySkuIds(@Param("skuIds") List<Long> skuIds);

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

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

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

    /**
     * 更新购物车
     *
     * @param shopCartItemList 购物车
     */
    void updateShopCartItemBatch(@Param("shopCartItemList") List<ShopCartItem> shopCartItemList);

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

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

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

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

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

    /**
     * 根据套餐id和套餐主商品id获取套餐搭配商品skuID
     *
     * @param comboId
     * @param skuId
     * @param userId
     * @return
     */
    List<ShopCartItemVO> getMatchSkuIdList(@Param("comboId") Long comboId, @Param("skuId") Long skuId, @Param("userId") Long userId);

    /**
     * 获取购物车主商品信息
     *
     * @param comboId
     * @param skuId
     * @param userId
     * @return
     */
    ShopCartItemVO getComboMainSpu(@Param("comboId") Long comboId, @Param("skuId") Long skuId, @Param("userId") Long userId);

    /**
     * 根据套餐id和套餐主商品id获取套餐搭配商品skuID
     *
     * @param parentShopCartId
     * @return
     */
    List<ShopCartItemVO> getMatchSpuList(@Param("parentShopCartId") Long parentShopCartId);

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

    /**
     * 根据套餐id和商品id获取购物信息
     *
     * @param comboId
     * @param spuId
     * @return
     */
    List<ShopCartItemVO> listShopCartItemByComboIdAndSpuId(@Param("comboId") Long comboId, @Param("spuId") Long spuId);
}
