package com.bonus.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author bonus 系统配置
 */
@RefreshScope
@Component
@ConfigurationProperties(prefix = "system-config")
@Data
public class SystemConfig {

    /**
     * 登录配置
     */
    private LoginConfig loginConfig;
    /**
     * 增加配置以支持增加根节点公司的添加和删除功能
     */
    private boolean addRootCompany;

    /**
     * 公司是否添加地址信息
     */
    private boolean addAddress;
    /**
     * token过期时间
     */
    private Long tokenTime;
    /**
     * 是否是管理员登录,如果启用超级管理员，则除了登录时需要系统验证码还需要短信验证码
     */
    private boolean admin;
    /**
     * 注册配置
     */
    private RegistersConfig registersConfig;
    /**
     * 网络请求
     */
    private RequestConfig requestConfig;
    /**
     * 密码配置校验
     */
    private PasswordConfig passwordConfig;

    /**
     * websocketUrl
     */
    private String websocketurl;

    @Data
    @RefreshScope
    public static class LoginConfig {
        /**
         * 手机密码登录
         */
        private boolean phonePassword;
        /**
         * 邮箱密码登录
         */
        private boolean emailPassword;
        /**
         * 手机验证码
         */
        private boolean phoneCode;
        /**
         * 邮箱验证码
         */
        private boolean emailCode;
    }

    @Data
    @RefreshScope
    public static class RegistersConfig {
        /**
         * 手机注册
         */
        private boolean phoneRegisters;
        /**
         * 邮箱注册
         */
        private boolean emailRegisters;
        /**
         * 是否开启手机验证码
         */
        private boolean verificationCode;
        /**
         * 注册是否审核
         */
        private boolean approvalStatus;
    }

    @Data
    @RefreshScope
    public static class RequestConfig {
        /**
         * 请求加密
         */
        private boolean encryptRequest;
        /**
         * 数据完整性校验
         */
        private boolean checkIntegrity;
        /**
         * 返回数据加密
         */
        private boolean encryptResponse;
    }

    @Data
    @RefreshScope
    public static class PasswordConfig {
        /**
         * 密码的最小长度
         */
        private int minLength;
        /**
         * 密码的最大长度
         */
        private int maxLength;
        /**
         * 是否需要包含大写字母
         */
        private boolean requireUpperCase;
        /**
         * 是否需要包含小写字母
         */
        private boolean requireLowerCase;
        /**
         * 是否需要包含数字
         */
        private boolean requireDigit;
        /**
         * 是否需要包含特殊字符
         */
        private boolean requireSpecialChar;
        /**
         * 常见的弱密码列表，禁止使用这些密码
         */
        private List<String> weakPasswords;
        /**
         * 密码历史记录限制
         */
        private int passwordHistoryLimit;
        /**
         * 是否限制连续相同字符
         */
        private boolean restrictConsecutiveChars;
        /**
         * 最大允许的连续字符数
         */
        private int maxConsecutiveChars;
        /**
         * 密码中是否不能包含用户名
         */
        private boolean excludeUsernameInPassword;
        /**
         * 是否在首次登录时强制修改密码
         */
        private boolean forcePasswordChangeOnFirstLogin;
        /**
         * 是否开启定期修改密码
         */
        private boolean enableRegularlyChangePassword;
        /**
         * 定期修改密码天数
         */
        private Integer regularlyChangePassword;
    }
}
