package org.xyzh.message.utils;

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.xyzh.message.config.SmsConfigProperties;

/**
 * @description 短信发送工具类 - 支持多种短信服务商
 * @filename SmsUtils.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-11-03
 */
@Component
@ConditionalOnBean(SmsConfigProperties.class)
public class SmsUtils {

    private static final Logger logger = LoggerFactory.getLogger(SmsUtils.class);

    @Autowired
    private SmsConfigProperties smsConfigProperties;

    /**
     * 发送短信验证码
     * @param phone 手机号
     * @param code 验证码
     * @return 是否发送成功
     */
    public boolean sendVerificationCode(String phone, String code) {
        // 如果未启用短信服务，使用模拟模式
        String accessKeyId = smsConfigProperties.getAccessKeyId();
        String accessKeySecret = smsConfigProperties.getAccessKeySecret();
        
        if (!StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
            logger.warn("短信服务未配置或未启用，使用模拟模式");
            logger.info("【模拟发送】短信验证码，手机号: {}, 验证码: {}", phone, code);
            return true;
        }

        // 根据配置的服务商选择发送方式
        String provider = smsConfigProperties.getProvider();
        if (provider == null) provider = "aliyun";
        
        switch (provider.toLowerCase()) {
            case "aliyun":
                return sendByAliyun(phone, code, smsConfigProperties.getTemplateCodeLogin());
            case "tencent":
                logger.warn("腾讯云短信服务暂未实现，使用模拟模式");
                logger.info("【模拟发送】短信验证码，手机号: {}, 验证码: {}", phone, code);
                return true;
            default:
                logger.error("未知的短信服务商: {}", provider);
                return false;
        }
    }

    /**
     * 使用阿里云发送短信验证码
     * @param phone 手机号
     * @param code 验证码
     * @param templateCode 短信模板CODE
     * @return 是否发送成功
     */
    private boolean sendByAliyun(String phone, String code, String templateCode) {
        try {
            Client client = createAliyunClient();
            
            SendSmsRequest request = new SendSmsRequest()
                    .setPhoneNumbers(phone)
                    .setSignName(smsConfigProperties.getSignName())
                    .setTemplateCode(templateCode)
                    .setTemplateParam("{\"code\":\"" + code + "\"}");
            
            SendSmsResponse response = client.sendSms(request);
            
            if ("OK".equals(response.getBody().getCode())) {
                logger.info("阿里云短信发送成功，手机号: {}, BizId: {}", phone, response.getBody().getBizId());
                return true;
            } else {
                logger.error("阿里云短信发送失败，手机号: {}, Code: {}, Message: {}", 
                    phone, response.getBody().getCode(), response.getBody().getMessage());
                return false;
            }
        } catch (Exception e) {
            logger.error("阿里云短信发送异常，手机号: {}, 错误: {}", phone, e.getMessage(), e);
            return false;
        }
    }

    /**
     * 创建阿里云短信客户端
     * @return 短信客户端
     */
    private Client createAliyunClient() throws Exception {
        Config config = new Config()
                .setAccessKeyId(smsConfigProperties.getAccessKeyId())
                .setAccessKeySecret(smsConfigProperties.getAccessKeySecret())
                .setEndpoint("dysmsapi.aliyuncs.com");
        return new Client(config);
    }

    /**
     * 发送通用短信（支持自定义模板）
     * @param phone 手机号
     * @param templateCode 模板CODE
     * @param templateParam 模板参数（JSON格式）
     * @return 是否发送成功
     */
    public boolean sendSms(String phone, String templateCode, String templateParam) {
        // 如果未启用短信服务，使用模拟模式
        String accessKeyId = smsConfigProperties.getAccessKeyId();
        String accessKeySecret = smsConfigProperties.getAccessKeySecret();
        
        if (!StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
            logger.warn("短信服务未配置或未启用，使用模拟模式");
            logger.info("【模拟发送】短信，手机号: {}, 模板: {}, 参数: {}", phone, templateCode, templateParam);
            return true;
        }

        // 根据配置的服务商选择发送方式
        String provider = smsConfigProperties.getProvider();
        if (provider == null) provider = "aliyun";
        
        switch (provider.toLowerCase()) {
            case "aliyun":
                return sendSmsAliyun(phone, templateCode, templateParam);
            case "tencent":
                logger.warn("腾讯云短信服务暂未实现，使用模拟模式");
                logger.info("【模拟发送】短信，手机号: {}, 模板: {}, 参数: {}", phone, templateCode, templateParam);
                return true;
            default:
                logger.error("未知的短信服务商: {}", provider);
                return false;
        }
    }

    /**
     * 使用阿里云发送通用短信
     */
    private boolean sendSmsAliyun(String phone, String templateCode, String templateParam) {
        try {
            Client client = createAliyunClient();
            
            SendSmsRequest request = new SendSmsRequest()
                    .setPhoneNumbers(phone)
                    .setSignName(smsConfigProperties.getSignName())
                    .setTemplateCode(templateCode)
                    .setTemplateParam(templateParam);
            
            SendSmsResponse response = client.sendSms(request);
            
            if ("OK".equals(response.getBody().getCode())) {
                logger.info("阿里云短信发送成功，手机号: {}, BizId: {}", phone, response.getBody().getBizId());
                return true;
            } else {
                logger.error("阿里云短信发送失败，手机号: {}, Code: {}, Message: {}", 
                    phone, response.getBody().getCode(), response.getBody().getMessage());
                return false;
            }
        } catch (Exception e) {
            logger.error("阿里云短信发送异常，手机号: {}, 错误: {}", phone, e.getMessage(), e);
            return false;
        }
    }

    /**
     * 批量发送短信
     * @param phones 手机号列表，用逗号分隔
     * @param templateCode 模板CODE
     * @param templateParam 模板参数（JSON格式）
     * @return 是否发送成功
     */
    public boolean sendBatchSms(String phones, String templateCode, String templateParam) {
        // 如果未启用短信服务，使用模拟模式
        String accessKeyId = smsConfigProperties.getAccessKeyId();
        String accessKeySecret = smsConfigProperties.getAccessKeySecret();
        
        if (!StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
            logger.warn("短信服务未配置或未启用，使用模拟模式");
            logger.info("【模拟发送】批量短信，手机号: {}, 模板: {}, 参数: {}", phones, templateCode, templateParam);
            return true;
        }

        // 根据配置的服务商选择发送方式
        String provider = smsConfigProperties.getProvider();
        if (provider == null) provider = "aliyun";
        
        switch (provider.toLowerCase()) {
            case "aliyun":
                return sendBatchSmsAliyun(phones, templateCode, templateParam);
            case "tencent":
                logger.warn("腾讯云短信服务暂未实现，使用模拟模式");
                logger.info("【模拟发送】批量短信，手机号: {}, 模板: {}, 参数: {}", phones, templateCode, templateParam);
                return true;
            default:
                logger.error("未知的短信服务商: {}", provider);
                return false;
        }
    }

    /**
     * 使用阿里云批量发送短信
     */
    private boolean sendBatchSmsAliyun(String phones, String templateCode, String templateParam) {
        try {
            Client client = createAliyunClient();
            
            SendSmsRequest request = new SendSmsRequest()
                    .setPhoneNumbers(phones)
                    .setSignName(smsConfigProperties.getSignName())
                    .setTemplateCode(templateCode)
                    .setTemplateParam(templateParam);
            
            SendSmsResponse response = client.sendSms(request);
            
            if ("OK".equals(response.getBody().getCode())) {
                logger.info("阿里云批量短信发送成功，手机号: {}, BizId: {}", phones, response.getBody().getBizId());
                return true;
            } else {
                logger.error("阿里云批量短信发送失败，手机号: {}, Code: {}, Message: {}", 
                    phones, response.getBody().getCode(), response.getBody().getMessage());
                return false;
            }
        } catch (Exception e) {
            logger.error("阿里云批量短信发送异常，手机号: {}, 错误: {}", phones, e.getMessage(), e);
            return false;
        }
    }

    /**
     * 生成6位数字验证码
     * @return 验证码
     */
    public static String generateVerificationCode() {
        return String.valueOf((int)((Math.random() * 9 + 1) * 100000));
    }

    /**
     * 验证手机号格式
     * @param phone 手机号
     * @return 是否有效
     */
    public static boolean isValidPhone(String phone) {
        if (phone == null || phone.trim().isEmpty()) {
            return false;
        }
        // 中国大陆手机号验证
        String regex = "^1[3-9]\\d{9}$";
        return phone.matches(regex);
    }
}

