package com.ningdatech.pmapi.sms.manage;

import cn.hutool.core.util.PhoneUtil;
import cn.hutool.core.util.RandomUtil;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.cache.model.cache.CacheKey;
import com.ningdatech.cache.repository.CachePlusOps;
import com.ningdatech.pmapi.sms.constant.VerificationCodeType;
import com.ningdatech.pmapi.sms.constant.YxtSmsTemplateConst;
import com.ningdatech.pmapi.sms.model.dto.VerifyCodeCacheDTO;
import com.ningdatech.pmapi.sms.model.po.ReqVerificationCodePO;
import com.ningdatech.pmapi.sms.utils.DateUtil;
import com.ningdatech.pmapi.sms.utils.SmsRedisKeyUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Collections;

/**
 * @author liuxinxin
 * @date 2023/2/16 下午4:42
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class SmsManage {
//
//    private final YxtClient yxtClient;
//    private final CachePlusOps cachePlusOps;
//
//    public void sendVerificationCode(ReqVerificationCodePO request) {
//        Assert.isTrue(PhoneUtil.isMobile(request.getMobile()), "手机号码格式不正确");
//        String verificationType = request.getVerificationType();
//        VerificationCodeType verificationCodeTypeEnum = VerificationCodeType.of(verificationType);
//
//        // 验证是否被锁定
//        String lockKey = SmsRedisKeyUtils.smsSendLockKey(verificationCodeTypeEnum, request.getMobile());
//        if (StringUtils.isNotBlank(cachePlusOps.get(lockKey))) {
//            throw BizException.wrap("今日" + verificationCodeTypeEnum.getDesc() + "的验证码发送次数过多，已被锁定");
//        }
//        // 验证发送间隔
//        String cacheKey = SmsRedisKeyUtils.smsCodeVerifyKey(verificationCodeTypeEnum, request.getMobile());
//        VerifyCodeCacheDTO preCache = (VerifyCodeCacheDTO) cachePlusOps.get(cacheKey);
//        if (preCache != null) {
//            if (LocalDateTime.now().minusMinutes(verificationCodeTypeEnum.getSendInterval())
//                    .isBefore(preCache.getSendTime())) {
//                throw BizException.wrap(verificationCodeTypeEnum.getSendInterval() + "分钟之内已发送过验证码，请稍后重试");
//            }
//        }
//        String code = RandomUtil.randomNumbers(6);
//        VerifyCodeCacheDTO cache = VerifyCodeCacheDTO.builder()
//                .code(code)
//                .sendTime(LocalDateTime.now())
//                .mobile(request.getMobile())
//                .build();
//
//        // 创建短信内容
//        SendSmsCmd sendSmsCmd = new SendSmsCmd();
//        switch (verificationCodeTypeEnum) {
//            case LOGIN:
//                SendSmsCmd.SendSmsContext sendSmsContext = new SendSmsCmd.SendSmsContext();
//                sendSmsContext.setReceiveNumber(request.getMobile());
//                sendSmsContext.setContent(String.format(YxtSmsTemplateConst.SMS_LOGIN_TEMPLATE, code, verificationCodeTypeEnum.getExpireTime()));
//                sendSmsCmd.setContextList(Collections.singletonList(sendSmsContext));
//                sendSmsCmd.setSmsSignEnum(YxtSmsSignEnum.ZJS_ELECTRONIC_EXPERT_LIB);
//                break;
//            default:
//                throw new IllegalArgumentException("非法的短信发送类型");
//        }
//        // 发送 短信
//        yxtClient.submitSmsTask(sendSmsCmd);
//        log.info("send verificationCode mobile = {},code = {}", request.getMobile(), code);
//
//        cachePlusOps.set(new CacheKey(cacheKey, Duration.ofMinutes(verificationCodeTypeEnum.getExpireTime())), cache);
//        String limitKey = SmsRedisKeyUtils.smsSendLimitKey(verificationCodeTypeEnum, request.getMobile());
//        if (StringUtils.isNotBlank(cachePlusOps.get(limitKey))) {
//            long limitCount = cachePlusOps.incr(new CacheKey(limitKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())));
//            // 超出单日发送次数之后直接锁定
//            if (limitCount >= verificationCodeTypeEnum.getSendTimesByDay().longValue()) {
//                cachePlusOps.set(new CacheKey(lockKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())), request.getMobile());
//            }
//        } else {
//            cachePlusOps.set(new CacheKey(limitKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())), 1);
//        }
//    }


}
