package com.jeequan.jeepay.core.sms;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.smsconfig.AliyundySmsConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/***
 * 阿里大于 实现， 避免 其他项目引用报错
 *
 * @author terrfly
 * @date 2023/8/18 16:34
 */
@Slf4j
public class AliyundySmsProcessKit{

    public static boolean callInterface(AliyundySmsConfig smsConfig, String templateId, String phone, String templateVal){

        try {

            if (smsConfig == null || StringUtils.isEmpty(templateId)) {
                return false;
            }
            log.info("读取短信配置：短信签名：{}", smsConfig.getSignName());
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile(AliyundySmsConfig.regionId, smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
            DefaultProfile.addEndpoint(AliyundySmsConfig.endpointName, AliyundySmsConfig.regionId, AliyundySmsConfig.product, AliyundySmsConfig.domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(phone);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(smsConfig.getSignName());
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(templateId);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(templateVal);

            //hint 此处可能会抛出异常，注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);

            log.info("调用阿里短信服务完成.phone={},code={},message={},requestId={},bizId={}", phone,
                    sendSmsResponse.getCode(), sendSmsResponse.getMessage(), sendSmsResponse.getRequestId(), sendSmsResponse.getBizId());

            return true;

        } catch (Exception e) {

            log.info("短信异常：", e);
            throw new BizException("短信发送失败");
        }
    }
}
