
package com.tmerclub.cloud.coupon.mapper;

import com.tmerclub.cloud.common.database.util.PageAdapter;
import com.tmerclub.cloud.common.order.vo.CouponOrderVO;
import com.tmerclub.cloud.coupon.dto.CouponDTO;
import com.tmerclub.cloud.coupon.model.Coupon;
import com.tmerclub.cloud.coupon.vo.CouponAppVO;
import com.tmerclub.cloud.coupon.vo.CouponVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 优惠券
 *
 * @author YXF
 * @date 2020-12-08 17:22:56
 */
public interface CouponMapper {

    /**
     * 获取优惠券列表
     *
     * @param couponDTO
     * @return 优惠券列表
     */
    List<CouponVO> list(@Param("coupon") CouponDTO couponDTO);

    /**
     * 获取优惠券列表
     *
     * @param couponDTO
     * @return 优惠券列表
     */
    List<CouponVO> adminList(@Param("coupon") CouponDTO couponDTO);

    /**
     * 获取店铺的可用的优惠券列表
     *
     * @param shopId
     * @return
     */
    List<CouponAppVO> getAvailableShopCouponList(@Param("shopId") Long shopId);

    /**
     * 根据优惠券id获取优惠券
     *
     * @param couponId 优惠券id
     * @return 优惠券
     */
    Coupon getByCouponId(@Param("couponId") Long couponId);

    /**
     * 保存优惠券
     *
     * @param coupon 优惠券
     */
    void save(@Param("coupon") Coupon coupon);

    /**
     * 更新优惠券
     *
     * @param coupon 优惠券
     */
    void update(@Param("coupon") Coupon coupon);

    /**
     * 更新优惠券
     *
     * @param coupon 优惠券
     */
    void updateCoupon(@Param("coupon") CouponDTO coupon);

    /**
     * 根据优惠券id，获取优惠券及关联的商品列表信息
     *
     * @param couponId
     * @return
     */
    CouponVO getCouponAndCouponProdsByCouponId(@Param("couponId") Long couponId);

    /**
     * 根据优惠券id，获取优惠券列表
     *
     * @param couponIds
     * @return 优惠券列表
     */
    List<Coupon> getListByCouponIds(@Param("couponIds") List<Long> couponIds);

    /**
     * 根据用户，返回对应的店铺优惠券列表
     *
     * @param userId
     * @return
     */
    List<CouponAppVO> generalCouponList(@Param("userId") Long userId);

    /**
     * 根据优惠券id列表，获取优惠券列表
     *
     * @param couponIds
     * @param putOnStatus
     * @return
     */
    List<Coupon> getCouponListByCouponIds(@Param("couponIds") List<Long> couponIds, @Param("putOnStatus") Integer putOnStatus);

    /**
     * 根据店铺和用户id，获取优惠券列表
     * @param couponIds
     * @return
     */
    List<CouponOrderVO> getCouponListByUserIdAndShopId(@Param("couponIds") List<Long> couponIds);

    /**
     * 商品优惠券分页
     *
     * @param page
     * @param userId
     * @return
     */
    List<CouponAppVO> getProdCouponList(@Param("page") PageAdapter page, @Param("userId") Long userId);

    /**
     * 获取商品优惠券的数量
     *
     * @return
     */
    Long getProdCouponListCount();

    /**
     * 更新活动投放状态、过期状态
     *
     * @param couponId
     * @param putOnStatus 投放状态
     * @param status      过期状态
     */
    void changeCouponStatusAndPutOnStatus(@Param("couponId") Long couponId, @Param("putOnStatus") Integer putOnStatus, @Param("status") Integer status);

    /**
     * 查询已经过期的优惠券的店铺有哪些
     *
     * @return 店铺id列表
     */
    List<Long> listOverdueStatusShopIds();

    /**
     * 取消投放已过期的优惠券
     */
    void cancelPut();

    /**
     * 投放优惠券
     */
    void putonCoupon();

    /**
     * 根据商品id列表，获取优惠券
     *
     * @param spuIds
     * @param shopIds
     * @return
     */
    List<CouponVO> listCouponBySpuIds(@Param("spuIds") List<Long> spuIds, @Param("shopIds") List<Long> shopIds);

    /**
     * 根据优惠券id列表，下线优惠券
     * @param couponIds
     */
    void batchOfflineByDiscountIdsAndStatus(@Param("couponIds") List<Long> couponIds);

    /**
     * 获取取消投放的优惠券id
     * @return
     */
    List<Coupon> cancelPutCouponIds();

    /**
     * 根据店铺id列表，获取满减活动id列表
     *
     * @param shopIds 店铺id列表
     * @return 满减活动id列表
     */
    List<Long> listIdByShopIds(@Param("shopIds") List<Long> shopIds);

    /**
     * 根据活动id列表，批量下线活动
     *
     * @param couponIds
     */
    void batchOfflineByCouponIds(@Param("couponIds") List<Long> couponIds);

    /**
     * 更新库存
     * @param couponId
     * @param changeStock
     */
    void updateStockById(@Param("couponId") Long couponId, @Param("changeStock") Integer changeStock);

    /**
     * 获取可能需要落库的正在进行的优惠券活动
     * @return
     */
    List<Long> listMaybeNeedStockPlacementActivity();

}
