package cn.ysk.cashier.mybatis.service;

import cn.ysk.cashier.dto.points.OrderDeductionPointsDTO;
import cn.ysk.cashier.mybatis.entity.TbMemberPoints;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 会员积分
 *
 * @author Tankaikai tankaikai@aliyun.com
 * @since 2.0 2024-10-25
 */
public interface TbMemberPointsService extends IService<TbMemberPoints> {

    /**
     * 会员积分分页
     *
     * @param params
     * @return
     */
    Map<String, Object> page(Map<String, Object> params);

    /**
     * 获取会员积分等信息
     *
     * @param memberId 会员id
     * @return
     */
    TbMemberPoints getMemberPoints(Long memberId);

    /**
     * 初始化会员积分
     *
     * @param memberId 会员id
     * @return
     */
    TbMemberPoints initMemberPoints(Long memberId);

    /**
     * 根据会员id及订单金额计算可抵扣积分及可抵扣金额
     *
     * @param memberId    会员id
     * @param orderAmount 订单金额
     * @return
     */
    OrderDeductionPointsDTO getMemberUsablePoints(Long memberId, BigDecimal orderAmount);

    /**
     * 根据抵扣金额计算抵扣积分
     *
     * @param memberId        会员id
     * @param orderAmount     订单金额
     * @param deductionAmount 抵扣金额
     */
    int calcUsedPoints(Long memberId, BigDecimal orderAmount, BigDecimal deductionAmount);

    /**
     * 根据抵扣积分计算抵扣金额
     *
     * @param memberId    会员id
     * @param orderAmount 订单金额
     * @param points      抵扣积分
     */
    BigDecimal calcDeductionAmount(Long memberId, BigDecimal orderAmount, int points);

    /**
     * 扣除积分
     *
     * @param memberId 会员id
     * @param points   积分
     * @param content  摘要信息（如：兑换积分商品/积分抵扣账单/消费赠送积分/新会员送积分/储值赠送积分）
     * @param orderId  订单id，可以为空
     * @throws Exception
     */
    boolean deductPoints(Long memberId, int points, String content, Long orderId);

    /**
     * 追加积分
     *
     * @param memberId 会员id
     * @param points   积分
     * @param content  摘要信息（如：兑换积分商品/积分抵扣账单/消费赠送积分/新会员送积分/储值赠送积分）
     * @param orderId  订单id，可以为空
     * @throws Exception
     */
    boolean addPoints(Long memberId, int points, String content, Long orderId);

    /**
     * 消费赠送积分
     *
     * @param memberId 会员id
     * @param orderId  订单id
     * @throws Exception
     */
    void consumeAwardPoints(Long memberId, Long orderId);
}