
package com.tmerclub.cloud.coupon.service;

import com.tmerclub.cloud.api.coupon.bo.CouponGiveBO;
import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO;
import com.tmerclub.cloud.api.coupon.dto.ReceiveCouponDTO;
import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.order.vo.CouponOrderVO;
import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO;
import com.tmerclub.cloud.coupon.dto.CouponUserDTO;
import com.tmerclub.cloud.coupon.vo.CouponAppVO;
import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserCountVO;
import com.tmerclub.cloud.coupon.vo.mongo.MongoCouponUserVO;
import org.apache.ibatis.annotations.Param;

import java.util.*;

/**
 * 优惠券用户关联信息
 *
 * @author YXF
 * @date 2020-12-08 17:22:57
 */
public interface CouponUserService {

    /**
     * 保存领券记录至mongodb
     * @param mongoCouponUserBO
     */
    void saveToMongodb(MongoCouponUserBO mongoCouponUserBO);

    /**
     * 批量保存领券记录至mongodb
     * @param list
     */
    void saveBatchToMongodb(List<MongoCouponUserBO> list);

    /**
     * 根据优惠券id和用户id，获取用户拥有该优惠券的数量
     *
     * @param couponId
     * @param usetId
     * @return 用户拥有该优惠券的数量
     */
    long getUserHasCouponCount(Long couponId, Long usetId);

    /**
     * 批量获取用户该优惠券（couponId）的数量
     *
     * @param couponIds 优惠券ids
     * @param userIds   用户ids
     * @return 集合
     */
    List<MongoCouponUserCountVO> getCouponsCountForUsers(List<Long> couponIds, List<Long> userIds);

    /**
     * 删除用户优惠券（逻辑删除）
     *
     * @param couponUserId
     */
    void deleteUserCouponByCouponId(Long couponUserId);

    /**
     * 获取用户优惠券的数量
     *
     * @param userId
     * @return key-- expiredCount:失效  allCount:全部 useCount:已使用  platformCount:平台券 multishopCount:店铺券
     */
    Map<String, Long> getCouponCountByStatus(Long userId);

    /**
     * 获取用户优惠券id列表
     *
     * @param coupons
     * @param couponIds
     * @return
     */
    void listByAndShopIdOrSpuId(List<CouponAppVO> coupons, List<Long> couponIds);

    /**
     * 获取可使用的优惠券数量
     *
     * @param userId
     * @return 可使用的优惠券数量
     */
    Long countCanUseCoupon(Long userId);

    /**
     * 统计用户优惠券相关数据
     *
     * @param userId
     * @param shopId
     * @return
     */
    CouponUserCountDataVO countCouponUserByUserId(Long userId, Long shopId);

    /**
     * 赠送优惠券
     *
     * @param couponGiveBO
     */
    void giveCoupon(CouponGiveBO couponGiveBO);


    /**
     * 删除用户失效180天以上的优惠券
     *
     * @param date 180天前
     */
    void deleteUnValidTimeCoupons(Date date);

    /**
     * 设置用户的过期优惠券为失效状态
     */
    void updateStatusByTime();

    /**
     * 获取某个用户的优惠券明细
     *
     * @param pageDTO       分页参数
     * @param couponUserDTO 条件查询参数
     * @return 用户的优惠券明细
     */
    PageVO<MongoCouponUserVO> getPageByUserId(PageDTO pageDTO, CouponUserDTO couponUserDTO);

    /**
     * 批量发送优惠券给客户
     *
     * @param bindCouponDTOList 多个用户发优惠券
     * @return 是否成功
     */
    Collection<Long> batchBindCoupon(List<BindCouponDTO> bindCouponDTOList);

    /**
     * 增加优惠券库存
     * @param couponId
     * @param stock
     * @param userIdSet
     */
    void addCouponStock(Long couponId, Integer stock, List<MongoCouponUserBO> userIdSet);

    /**
     * 批量删除用户优惠券
     *
     * @param bindCouponDTOList 多个用户失效多张优惠券
     * @return 是否成功
     */
    Collection<Long> batchDeleteUserCoupon(List<BindCouponDTO> bindCouponDTOList);

    /**
     * 统计领取但未使用的优惠券数量
     *
     * @param couponId 优惠券id
     * @return
     */
    long countUnUseCoupon(Long couponId);

    /**
     * 统计用户领取优惠券数量
     * @param receiveCouponDTO
     * @return
     */
    List<Long> userReceiveCouponCount(ReceiveCouponDTO receiveCouponDTO);

    /**
     * 批量更新优惠券状态
     * @param status
     * @param userCouponIds
     */
    void batchUpdateUserCouponStatus(Integer status, List<Long> userCouponIds);

    /**
     * 还原订单使用的商家优惠券
     * @param couponUserId
     */
    void reductionCoupon(List<Long> couponUserIds);

    /**
     * 获取领券会员数
     * @param shopId 店铺id
     * @param startTime 起始时间
     * @param endTime 结束时间
     * @return 领券会员数
     */
    List<Long> countMemberCouponByParam(Long shopId, Date startTime, Date endTime);

    /**
     * 获取用户所有的或者指定状态下的优惠券列表
     * @param page
     * @param userId 用户id
     * @param type   类型 0：所有 1：平台优惠券 2：店铺优惠券
     * @param status 优惠券状态 0:已过期  2:已使用
     * @return
     */
    PageVO<CouponAppVO> pageUserCoupon(PageDTO page, Long userId, Long type, Integer status);

    /**
     * 补充领券记录信息
     * @param couponList
     * @param userId
     * @return
     */
    List<CouponAppVO> setCouponUserInfo(List<CouponAppVO> couponList, Long userId);

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

    /**
     * 初始化领券记录到mongodb
     */
    void initCouponUserToMongodb();

    /**
     * 获取领券数量
     * @param couponId
     * @return
     */
    int countReceiveCoupon(Long couponId);

    /**
     * 获取是否有领券记录
     * @param couponUserIds
     * @return
     */
    List<MongoCouponUserBO> listCouponUserIdsByIds(List<Long> couponUserIds);
}
