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

import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
import cn.newfeifan.mall.module.distri.enums.CaclEnum;
import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.Map;

/**
 * 推荐用户积分 Service 实现类
 *
 * @author 非繁人
 */
@Service
@Validated
public class IntegralServiceImpl implements IntegralService {

//    @Resource
//    private DuserMapper duserMapper;

//    @Resource
//    private IntegralMapper integralMapper;

    @Resource
    private PtProfitMapper ptProfitMapper;

    @Resource
    private PtProfitLogService ptProfitLogService;

//    @Override
//    public Long createIntegral(IntegralSaveReqVO createReqVO) {
//        // 插入
//        IntegralDO integral = BeanUtils.toBean(createReqVO, IntegralDO.class);
//        integralMapper.insert(integral);
//        // 返回
//        return integral.getId();
//    }
//
//    @Override
//    public void updateIntegral(IntegralSaveReqVO updateReqVO) {
//        // 校验存在
//        validateIntegralExists(updateReqVO.getId());
//        // 更新
//        IntegralDO updateObj = BeanUtils.toBean(updateReqVO, IntegralDO.class);
//        integralMapper.updateById(updateObj);
//    }
//
//    @Override
//    public void deleteIntegral(Long id) {
//        // 校验存在
//        validateIntegralExists(id);
//        // 删除
//        integralMapper.deleteById(id);
//    }
//
//    private void validateIntegralExists(Long id) {
//        if (integralMapper.selectById(id) == null) {
//            throw exception(INTEGRAL_NOT_EXISTS);
//        }
//    }
//
//    @Override
//    public IntegralDO getIntegral(Long id) {
//        return integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eq(IntegralDO::getUserId,id));
//    }
//
//    @Override
//    public PageResult<IntegralDO> getIntegralPage(IntegralPageReqVO pageReqVO) {
//        return integralMapper.selectPage(pageReqVO);
//    }
//
//    @Override
//    public IntegralDO selectByUser(Long descendant) {
//        return integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, descendant));
//    }

    /**
     * add by Ben
     * 修改用户积分
     *
     * @param userId 要修改积分的用户
     * @param caclEnum 导致积分变化的事件类型枚举
     * @param amount 用户可用积分变化金额，可为负数
     * @param freezeAmount 用户冻结积分变化金额，可为负数
     * @return 返回是否执行成功。执行失败，通常是就是用户积分不足，没积分抵扣
     */
    @Override
    public Boolean updateUserIntegral(Long userId, CaclEnum caclEnum, Long amount, Long freezeAmount,
                                      Long tradeOrderId,
                                      String OrderNum
                                      ) {
        Boolean success = null;

        //修改用户积分钱包的积分
        int effectRowNum = ptProfitMapper.updateUserIntegral(amount,amount,freezeAmount,freezeAmount,userId);

        if (effectRowNum==1) {//如果成功修改积分记录
            success = true;

            //用户修改后的当前可用的钱包余额
            Long afterAmount = null;
            //用户修改后的冻结积分钱包余额
            Long afterFreezeAmount = null;

            //查询用户修改后的积分
            Map<String, Object> map = ptProfitMapper.selectUserIntegral(userId);
            Object currentQuotaObj = map.get("current_quota");
            Object freezeQuotaObj = map.get("freeze_quota");

            afterAmount = (Long)currentQuotaObj;
            afterFreezeAmount = (Long)freezeQuotaObj;

            if(afterAmount<0||afterFreezeAmount<0){
                throw new RuntimeException("用户钱包为负数：用户IO为"+userId+"的用户可用钱包为"+afterAmount+",冻结钱包为"+afterFreezeAmount);
            }

            //记录用户的积分变动日志
            ptProfitLogService.addMessage(userId, caclEnum, amount, afterAmount,
                    freezeAmount, afterFreezeAmount,null,tradeOrderId,OrderNum);

        }else if(effectRowNum<1){//如果钱包积分不足，不够抵扣
            success = false;
        } else if (effectRowNum>1) {
//            success = false;
            throw new RuntimeException("用户IO为"+userId+"的用户钱包不只一个！");
        }

        return success;
    }

//
//    /**
//     * 修改用户身价
//     * @param userId 用户ID
//     * @param socialStatusUpdateEnum 身价变动类别
//     * @param socialStatusPoint 身价变化值
//     * @param ObjectId 导致身价变动的对应业务对象ID，如订单ID、收藏记录ID、新注册用户ID等
//     * @return 升级后的身价名称，如果返回null，表明没升级
//     */
//    public String updateUserSocialStatus(Long userId, SocialStatusUpdateEnum socialStatusUpdateEnum, Integer socialStatusPoint,
//                                   Long ObjectId){
//        //升级后的身价名称，如果返回null，表明没升级
//        String newSocialStatusName = null;
//        //用户身价升了几级
//        Integer socialStatusUpgradation = 0;
//
//        DuserDO duser = duserMapper.selectOne("user_id", userId);
//        Integer oldSocialStatus = duser.getSocialStatus();//升级前身价等级
//
//        return newSocialStatusName;
//    }
}