package com.ruoyi.framework.config.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import com.ruoyi.common.utils.StringUtils;

/**
 * 登录身份鉴别配置，绑定 {@code application.yml} 中 {@code login.*}。
 * <p>
 * <b>切换若依默认登录（单配置项）</b>：任选其一即可
 * <ul>
 *   <li>{@code login.auth-mode: ruoyi} — 推荐，语义最清晰</li>
 *   <li>{@code login.internet-sms.enabled: false} — 等价开关</li>
 * </ul>
 * 关闭后仅需用户名 + 密码 + 图形验证码，不要求 {@code smsCode}。
 * </p>
 *
 * @see com.ruoyi.framework.web.service.LoginSmsService
 */
@ConfigurationProperties(prefix = "login")
public class LoginProperties
{
    /**
     * 登录鉴别模式。
     * <ul>
     *   <li>{@code ruoyi} — 若依自带登录（账号+密码+图形验证码）</li>
     *   <li>{@code sms-2fa} — 互联网短信双因子（还须策略表命中 SMS_2FA）</li>
     * </ul>
     * 非空时优先于 {@link InternetSms#enabled}。
     */
    private String authMode = "";

    /**
     * 当前部署网络区域（auth-mode=sms-2fa 时与 sys_login_policy 配合）。
     * INTERNAL=内网；INTERNET=互联网。
     */
    private String networkZone = "INTERNAL";

    private InternetSms internetSms = new InternetSms();

    public String getAuthMode()
    {
        return authMode;
    }

    public void setAuthMode(String authMode)
    {
        this.authMode = authMode;
    }

    /**
     * 是否启用互联网短信双因子（综合 auth-mode 与 internet-sms.enabled）。
     */
    public boolean isSmsTwoFactorActive()
    {
        if (StringUtils.isNotEmpty(authMode))
        {
            if ("ruoyi".equalsIgnoreCase(authMode.trim()))
            {
                return false;
            }
            if ("sms-2fa".equalsIgnoreCase(authMode.trim())
                    || "sms_2fa".equalsIgnoreCase(authMode.trim()))
            {
                return true;
            }
        }
        return internetSms.isEnabled();
    }

    public String getNetworkZone()
    {
        return networkZone;
    }

    public void setNetworkZone(String networkZone)
    {
        this.networkZone = networkZone;
    }

    public InternetSms getInternetSms()
    {
        return internetSms;
    }

    public void setInternetSms(InternetSms internetSms)
    {
        this.internetSms = internetSms;
    }

    /** 互联网短信双因子相关参数 */
    public static class InternetSms
    {
        /** 总开关；false 时全站不校验 smsCode */
        private boolean enabled = false;

        /** OTP 位数，等保常见为 6 位数字 */
        private int codeLength = 6;

        /** OTP 在 Redis 中的存活时间（秒），默认 300 */
        private int codeTtlSeconds = 300;

        /** 同一 IP 两次发送的最小间隔（秒），默认 60 */
        private int sendIntervalSeconds = 60;

        public boolean isEnabled()
        {
            return enabled;
        }

        public void setEnabled(boolean enabled)
        {
            this.enabled = enabled;
        }

        public int getCodeLength()
        {
            return codeLength;
        }

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

        public int getCodeTtlSeconds()
        {
            return codeTtlSeconds;
        }

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

        public int getSendIntervalSeconds()
        {
            return sendIntervalSeconds;
        }

        public void setSendIntervalSeconds(int sendIntervalSeconds)
        {
            this.sendIntervalSeconds = sendIntervalSeconds;
        }
    }
}
