import { OpResult } from 'mslib'
import { AppOptionsConfig } from './AppOptionsConfig'

/**
 * 应用选项配置校验器
 * @date 2021-05-28 17:13:50
 * @author 吴锋霖
 */
class AppOptionsConfigChcker {

    /**
     * 校验
     * @param config
     */
    static check(config?: AppOptionsConfig): OpResult<string> {
        if (!config) {
            return OpResult.error('应用选项配置未设置')
        }

        let op = this.checkElasticConfig(config)
        if (!op.isSuccess()) {
            return op;
        }
        op = this.checkK8sConfig(config)
        if (!op.isSuccess()) {
            return op;
        }
        op = this.checkLogConfig(config)
        if (!op.isSuccess()) {
            return op;
        }
        op = this.checkSpecConfig(config)
        if (!op.isSuccess()) {
            return op;
        }
    }

    private static checkElasticConfig(config: AppOptionsConfig): OpResult<string> {
        if (!config.elasticConfig) {
            return OpResult.error('应用选项配置校验失败，未配置弹性伸缩 [elasticConfig]')
        }
        const elasticConfig = config.elasticConfig;
        if (!elasticConfig.minInstance || elasticConfig.minInstance <= 0) {
            return OpResult.error('应用选项配置校验失败，未配置弹性伸缩最小实例数')
        }
        if (elasticConfig.elasticType !== '0' && elasticConfig.elasticType !== '1') {
            return OpResult.error(`应用选项配置校验失败，弹性伸缩类型[${elasticConfig.elasticType}]无法解析`)
        }
        return OpResult.success('OK')
    }

    private static checkK8sConfig(config: AppOptionsConfig): OpResult<string> {
        if (!config.k8sConfig) {
            return OpResult.error('应用选项配置校验失败，未配置K8S [k8sConfig]')
        }
        return OpResult.success('OK')
    }

    private static checkLogConfig(config: AppOptionsConfig): OpResult<string> {
        if (!config.logConfig) {
            return OpResult.error('应用选项配置校验失败，未配置日志服务 [logConfig]')
        }
        return OpResult.success('OK')
    }


    private static checkSpecConfig(config: AppOptionsConfig): OpResult<string> {
        if (!config.specConfig) {
            return OpResult.error('应用选项配置校验失败，未配置部署规格 [specConfig]')
        }
        return OpResult.success('OK')
    }

}

export { AppOptionsConfigChcker }