package com.ylx.point.service;

import com.ylx.point.domain.dto.ApiAddPointsDTO;

public interface IPointAccountService {

    /**
     * 增加用户积分
     *
     * @param openId       用户openId
     * @param points       积分数量（正数）
     * @param activityName 活动名称
     * @param bizOrderNo   业务订单号
     * @param activityId   活动ID
     * @param taskId       任务ID
     * @param taskType     任务类型
     * @param taskName     任务名称
     * @return 变动后的余额
     */
    Integer addPoints(String openId, int points, String activityName, String bizOrderNo, Long activityId, Long taskId, Integer taskType, String taskName);

    /**
     * 扣减用户积分（用于积分商品下单）
     * 扣减顺序：先获取的先扣减（FIFO原则）
     *
     * @param openId         用户openId
     * @param pointsToDeduct 需要扣减的积分数量（正数）
     * @param bizOrderNo     业务订单号
     * @param taskName   任务名称（如：积分商品兑换）
     * @return Integer 变动后的余额
     */
    Integer deductPoints(String openId, int pointsToDeduct, String bizOrderNo, String taskName);

    /**
     * 退款积分（用于积分商品退款）
     * 退回的积分没有过期时间
     *
     * @param openId         用户openId
     * @param pointsToRefund 需要退回的积分数量（正数）
     * @param bizOrderNo     业务订单号
     * @param activityName   活动名称（如：积分商品退款）
     * @return 变动后的余额
     */
    Integer refundPoints(String openId, int pointsToRefund, String bizOrderNo, String activityName);

    void apiAddPoints(ApiAddPointsDTO dto);

    void draw();
}
