package cn.newfeifan.mall.module.distri.service.integral;

import javax.validation.*;

import cn.newfeifan.mall.module.distri.controller.app.integral.vo.*;
import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
import cn.newfeifan.mall.module.distri.enums.CaclEnum;
import cn.newfeifan.mall.module.distri.enums.IntegralEnum;

/**
 * 推荐用户积分 Service 接口
 *
 * @author 非繁人
 */
public interface IntegralService {

    /**
     * 创建推荐用户积分
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createIntegral(@Valid IntegralSaveReqVO createReqVO);

    /**
     * 更新推荐用户积分
     *
     * @param updateReqVO 更新信息
     */
    void updateIntegral(@Valid IntegralSaveReqVO updateReqVO);

    /**
     * 获得推荐用户积分
     *
     * @param id 编号
     * @return 推荐用户积分
     */
    IntegralDO getIntegral(Long id);

    /**
     * 根据用户ID查询是否有钱包
     */
    IntegralDO selectByUser(Long descendant);


    /**
     * 修改用户积分
     *
     * @param generateUserId 导致产生积分变动的用户ID
     * @param userId 要修改积分的用户
     * @param integralEnum 导致积分变化的事件类型枚举
     * @param amount 用户积分变化金额，可为负数
     */
    void updateUserIntegral(Long generateUserId,//导致产生积分变动的用户ID
                            Long userId, IntegralEnum integralEnum, Long amount,
                            Long tradeOrderId,
                            String orderNum,
                            Integer integralType,
                            Long highQuota
    );

    /**
     * 给商户绑定的用户结算价
     * @param orderId 订单id
     * @param orderNum 订单编号
     * @param amount 结算价
     * @param userId 用户id
     * @param integralEnum 积分类型
     * @param generateUserId 订单用户id
     */
    void updateSHUserIntegral(Long orderId, String orderNum, Long amount, Long userId, IntegralEnum integralEnum, Long generateUserId);

    /**
     * 增加用户的直推奖
     * @param generateUserId 奖金来源用户
     * @param userId 用户id
     * @param integralEnum  奖项类别
     * @param amount 额度
     * @param orderId 订单id
     * @param orderNo 订单编号
     */
    void updateUserIntegralByBonus(Long generateUserId, Long userId, IntegralEnum integralEnum, Long amount, Long orderId, String orderNo);

    /**
     * 修改用户积分
     * @param userId 用户ID
     * @param caclEnum 变化类型
     * @param payIntegral 变化积分
     * @param tradeOrderId 订单ID
     * @param orderNum 订单号
     */
    void updateUserIntegral(Long userId, CaclEnum caclEnum, Long payIntegral, Long tradeOrderId, String orderNum);

    /**
     * 佣金转化
     *
     * @param respVO 积分类型
     * @return 结果
     */
    Boolean quotaTransition(IntegralTransitionRespVO respVO);
}