package com.czg.account.service;

import com.czg.account.dto.points.OrderDeductionPointsDTO;
import com.czg.account.entity.MemberPoints;
import com.czg.account.param.MemberPointsParam;
import com.czg.order.entity.OrderInfo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;

import java.math.BigDecimal;

/**
 * 会员积分
 *
 * @author Tankaikai tankaikai@aliyun.com
 * @since 1.0 2025-02-25
 */
public interface MemberPointsService extends IService<MemberPoints> {

    /**
     * 会员积分分页
     *
     * @param param 查询参数
     * @return 分页结果
     */
    Page<MemberPoints> getMemberPointsPage(MemberPointsParam param);

    /**
     * 初始化会员积分
     *
     * @param shopUserId 用户id
     * @return 会员积分等信息
     */
    MemberPoints initMemberPoints(Long shopUserId);

    /**
     * 获取会员积分等信息
     *
     * @param shopUserId 用户id
     * @return 会员积分等信息
     */
    MemberPoints getMemberPoints(Long shopUserId);

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

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

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

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

    /**
     * 追加积分
     *
     * @param shopUserId  用户id
     * @param points  积分
     * @param content 摘要信息（如：兑换积分商品/积分抵扣账单/消费赠送积分/新会员送积分/储值赠送积分）
     * @param orderInfo 订单信息，可以为空
     * @return 成功/失败
     */
    boolean addPoints(Long shopUserId, int points, String content, OrderInfo orderInfo);

    /**
     * 消费赠送积分
     *
     * @param shopUserId  用户id
     * @param orderInfo 订单信息，可以为空
     */
    void consumeAwardPoints(Long shopUserId, OrderInfo orderInfo);

}