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

import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
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;

import javax.validation.Valid;

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

//    /**
//     * 创建推荐用户积分
//     *
//     * @param createReqVO 创建信息
//     * @return 编号
//     */
//    Long createIntegral(@Valid IntegralSaveReqVO createReqVO);
//
//    /**
//     * 更新推荐用户积分
//     *
//     * @param updateReqVO 更新信息
//     */
//    void updateIntegral(@Valid IntegralSaveReqVO updateReqVO);
//
//    /**
//     * 删除推荐用户积分
//     *
//     * @param id 编号
//     */
//    void deleteIntegral(Long id);
//
//    /**
//     * 获得推荐用户积分
//     *
//     * @param id 编号
//     * @return 推荐用户积分
//     */
//    IntegralDO getIntegral(Long id);
//
//    /**
//     * 获得推荐用户积分分页
//     *
//     * @param pageReqVO 分页查询
//     * @return 推荐用户积分分页
//     */
//    PageResult<IntegralDO> getIntegralPage(IntegralPageReqVO pageReqVO);
//
//    /**
//     * 根据用户ID查询是否有钱包
//     * @param descendant
//     * @return
//     */
//    IntegralDO selectByUser(Long descendant);


    /**
     * 修改用户积分
     *
     * @param generateUserId 要修改积分的用户
     * @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 userId 用户ID
     * @param caclEnum 变化类型
     * @param payIntegral 变化积分
     * @param tradeOrderId 订单ID
     * @param orderNum 订单号
     */
    void updateUserIntegral(Long userId, CaclEnum caclEnum, Long payIntegral, Long tradeOrderId, String orderNum);

//    /**
//     * 修改用户身价
//     * @param userId 用户ID
//     * @param socialStatusUpdateEnum 身价变动类别
//     * @param socialStatusPoint 身价变化值
//     * @param ObjectId 导致身价变动的对应业务对象ID，如订单ID、收藏记录ID、新注册用户ID等
//     * @return 升级后的身价名称，如果返回null，表明没升级
//     */
//    String updateUserSocialStatus(Long userId, SocialStatusUpdateEnum socialStatusUpdateEnum, Integer socialStatusPoint,
//                                   Long ObjectId);

    /**
     * 修改用户身价
     * @param generateUserId 导致产生积分变动的用户ID
     * @param userId 身价变动类别
     * @param caclEnum 变化类型
     * @param totalFreezeHighQuota 冻结峰值
     * @param tradeOrderId 订单ID
     * @param orderNum 订单号
     */
    void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum);

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

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

    /**
     * 修改推荐人的积分和峰值
     * @param orderUserId 订单用户id
     * @param ancesterUserId 推荐人id
     * @param caclEnum 类型
     * @param ancestorIncreaseIntegral 变动的积分
     * @param tradeOrderId 订单id
     * @param tradeOrderNum 订单号
     */
    void updateUserIntegralByAmountWithHighQuota(Long orderUserId, Long ancesterUserId, CaclEnum caclEnum, Long ancestorIncreaseIntegral, Long tradeOrderId, String tradeOrderNum);
}