package com.yonge.cooleshow.biz.dal.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;

/**
 * <p>
 * 优惠券信息 服务类
 * </p>
 *
 * @author Eric
 * @since 2022-09-02
 */
public interface CouponInfoService extends IService<CouponInfo> {

    /**
     * 分页查询优惠券信息
     * @param page IPage<CouponInfoWrapper>
     * @param query CouponInfoQuery
     * @return IPage<CouponInfoWrapper>
     */
    IPage<CouponInfoWrapper> queryCouponPageInfo(IPage<CouponInfoWrapper> page, CouponInfoQuery query);

    /**
     * 优惠券信息
     * @param id 优惠券ID
     * @return CouponInfo
     */
    CouponInfo queryCouponInfoById(Long id);

    /**
     * 新增或更新优惠券信息
     * @param couponInfo CouponInfo
     * @param stateUpdate 状态更新标识
     * @return CouponInfo
     */
    CouponInfo saveOrUpdateCouponInfo(CouponInfo couponInfo, Boolean stateUpdate);

    /**
     * 优惠券库存量调整信息
     * @param page IPage<CouponInventoryWrapper>
     * @param query CouponInventoryQuery
     * @return IPage<CouponInventoryWrapper>
     */
    IPage<CouponInventoryWrapper> queryCouponInventoryPageInfo(IPage<CouponInventoryWrapper> page, CouponInventoryQuery query);

    /**
     * 查询订单优惠券信息
     * @param userId 用户ID
     * @param query CouponInfoQuery.CouponOrderQuery
     * @return CouponOrderWrapper
     */
    CouponOrderWrapper queryUserOrderCouponInfo(Long userId, CouponInfoQuery.CouponOrderQuery query);

    /**
     * 更新用户订单优惠券状态
     * @param wrapper CouponOrderWrapper
     * @return int 受影响的行数
     */
    int updateUserOrderCouponInfo(CouponOrderWrapper wrapper);

    /**
     * 新增优惠券库存量调整信息
     * @param inventory CouponInventory
     * @return int 入库行数
     */
    int saveOrUpdateCouponInventoryInfo(CouponInventory inventory);

    /**
     * 优惠券库存变更
     *
     * @param couponId 优惠券id
     * @param size 变更数量
     * @param inOrOut 增/减状态
     * @return
     */
    int updateStock(Long couponId, int size, InOrOutEnum inOrOut);
}
