package com.yc.ship.module.marketing.service.coupon;

import com.yc.ship.framework.common.pojo.PageResult;
import com.yc.ship.module.marketing.controller.admin.coupon.vo.CouponPageReqVO;
import com.yc.ship.module.marketing.controller.admin.coupon.vo.CouponSaveReqVO;
import com.yc.ship.module.marketing.controller.app.coupon.vo.AppCouponCanUseReqVo;
import com.yc.ship.module.marketing.dal.dataobject.coupon.CouponDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 优惠券 Service 接口
 *
 * @author lfy
 */
public interface CouponService {

    /**
     * 创建优惠券
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCoupon(@Valid CouponSaveReqVO createReqVO);

    /**
     * 更新优惠券
     *
     * @param updateReqVO 更新信息
     */
    void updateCoupon(@Valid CouponSaveReqVO updateReqVO);

    /**
     * 删除优惠券
     *
     * @param id 编号
     */
    void deleteCoupon(Long id);

    /**
     * 获得优惠券
     *
     * @param id 编号
     * @return 优惠券
     */
    CouponDO getCoupon(Long id);

    /**
     * 获得优惠券分页
     *
     * @param pageReqVO 分页查询
     * @return 优惠券分页
     */
    PageResult<CouponDO> getCouponPage(CouponPageReqVO pageReqVO);

    /**
     * 获取优惠券列表
     * @param ids
     * @return
     */
    List<CouponDO> getCouponList(Collection<Long> ids);

    /**
     * 获取当前用户可以领取的优惠券列表
     * @param memberId
     * @return
     */
    List<CouponDO> getCanReceiveCouponList(Long memberId);

    /**
     * 获取当前用户已领取的优惠券列表
     * @param memberId
     * @return
     */
    List<CouponDO> getReceivedCouponList(Long memberId);

    /**
     * 领取优惠券
     * @param memberId
     * @param couponId
     * @return
     */
    Long receiveCoupon(Long memberId, Long couponId);

    /**
     * 查询可以使用的优惠券
     * @param loginUserId
     * @param reqVo
     * @return
     */
    List<CouponDO> getCanUseCouponList(Long loginUserId, AppCouponCanUseReqVo reqVo);

    /**
     * 获取我的未使用优惠券列表
     * @param loginUserId
     * @return
     */
    List<CouponDO> getMyUnUseCouponList(Long loginUserId);

    /**
     * 获取我的已使用优惠券列表
     * @param loginUserId
     * @return
     */
    List<CouponDO> getMyUsedCouponList(Long loginUserId);

    /**
     * 获取我的已过期优惠券列表
     * @param loginUserId
     * @return
     */
    List<CouponDO> getMyExpiredCouponList(Long loginUserId);

    /**
     * 根据优惠券码ID获取优惠券
     * @param couponCodeId 优惠券码ID
     * @return
     */
    CouponDO getByCouponCodeId(Long couponCodeId);

    /**
     * 获取当前产品可以领取的优惠券列表
     * @param loginUserId
     * @param spuId
     * @return
     */
    List<CouponDO> getCanReceiveCouponListBySpuId(Long loginUserId, Long spuId);
}