package com.huimv.employment.integration.sms;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * 短信验证码相关配置，绑定 {@code fe.sms.*} 配置项。
 * <p>
 * 典型配置示例：
 * <pre>
 * fe:
 *   sms:
 *     mock-enabled: true
 *     mock-code: "123456"
 *     code-ttl-seconds: 300
 *     send-cooldown-seconds: 60
 *     aliyun:
 *       access-key-id: xxx
 *       access-key-secret: xxx
 *       sign-name: 签名名称
 *       template-code: SMS_xxx
 * </pre>
 * </p>
 */
@ConfigurationProperties(prefix = "fe.sms")
public class SmsProperties {

    /**
     * Mock 开关。
     * <ul>
     *   <li>{@code true}（默认）：不发真实短信，使用 {@link #mockCode} 固定验证码，适合本地开发</li>
     *   <li>{@code false}：走 {@link AliyunSmsSender} 调用阿里云短信 API</li>
     * </ul>
     */
    private boolean mockEnabled = true;

    /** Mock 模式下的固定验证码，默认 123456 */
    private String mockCode = "123456";

    /** 验证码在 Redis 中的有效期（秒），默认 5 分钟，与技术方案 §7.3 一致 */
    private int codeTtlSeconds = 300;

    /** 同一手机号两次发送之间的最小间隔（秒），默认 60 秒，防刷 */
    private int sendCooldownSeconds = 60;

    /** 非 Mock 模式下随机验证码的位数，默认 6 位纯数字 */
    private int codeLength = 6;

    /** 同一验证码允许的最大校验失败次数，超出后作废验证码 */
    private int maxVerifyAttempts = 5;

    /** 阿里云短信配置，仅 mock-enabled=false 时生效 */
    private Aliyun aliyun = new Aliyun();

    public boolean isMockEnabled() {
        return mockEnabled;
    }

    public void setMockEnabled(boolean mockEnabled) {
        this.mockEnabled = mockEnabled;
    }

    public String getMockCode() {
        return mockCode;
    }

    public void setMockCode(String mockCode) {
        this.mockCode = mockCode;
    }

    public int getCodeTtlSeconds() {
        return codeTtlSeconds;
    }

    public void setCodeTtlSeconds(int codeTtlSeconds) {
        this.codeTtlSeconds = codeTtlSeconds;
    }

    public int getSendCooldownSeconds() {
        return sendCooldownSeconds;
    }

    public void setSendCooldownSeconds(int sendCooldownSeconds) {
        this.sendCooldownSeconds = sendCooldownSeconds;
    }

    public int getCodeLength() {
        return codeLength;
    }

    public void setCodeLength(int codeLength) {
        this.codeLength = codeLength;
    }

    public int getMaxVerifyAttempts() {
        return maxVerifyAttempts;
    }

    public void setMaxVerifyAttempts(int maxVerifyAttempts) {
        this.maxVerifyAttempts = maxVerifyAttempts;
    }

    public Aliyun getAliyun() {
        return aliyun;
    }

    public void setAliyun(Aliyun aliyun) {
        this.aliyun = aliyun;
    }

    /**
     * 阿里云短信服务（dysmsapi）连接参数。
     * <p>AccessKey 等敏感信息建议通过环境变量注入，勿提交到代码仓库。</p>
     */
    public static class Aliyun {

        /** 阿里云 AccessKey ID，环境变量：ALIYUN_SMS_ACCESS_KEY_ID */
        private String accessKeyId;

        /** 阿里云 AccessKey Secret，环境变量：ALIYUN_SMS_ACCESS_KEY_SECRET */
        private String accessKeySecret;

        /** 短信签名名称，需在阿里云控制台审核通过 */
        private String signName;

        /** 短信模板 CODE，如 SMS_123456789，模板需包含验证码变量 */
        private String templateCode;

        /**
         * 模板变量名，需与阿里云控制台模板中的变量名一致。
         * 例如模板内容为「您的验证码为${code}」，则此处填 code。
         */
        private String templateParamName = "code";

        /** 短信 API 接入点，国内默认 dysmsapi.aliyuncs.com */
        private String endpoint = "dysmsapi.aliyuncs.com";

        public String getAccessKeyId() {
            return accessKeyId;
        }

        public void setAccessKeyId(String accessKeyId) {
            this.accessKeyId = accessKeyId;
        }

        public String getAccessKeySecret() {
            return accessKeySecret;
        }

        public void setAccessKeySecret(String accessKeySecret) {
            this.accessKeySecret = accessKeySecret;
        }

        public String getSignName() {
            return signName;
        }

        public void setSignName(String signName) {
            this.signName = signName;
        }

        public String getTemplateCode() {
            return templateCode;
        }

        public void setTemplateCode(String templateCode) {
            this.templateCode = templateCode;
        }

        public String getTemplateParamName() {
            return templateParamName;
        }

        public void setTemplateParamName(String templateParamName) {
            this.templateParamName = templateParamName;
        }

        public String getEndpoint() {
            return endpoint;
        }

        public void setEndpoint(String endpoint) {
            this.endpoint = endpoint;
        }
    }
}
