package io.horizon.runtime;

import io.horizon.util.HUt;

import java.util.Arrays;

/**
 * 核心系统环境变量接口，可直接实现
 * - Macrocosm：宏观世界，核心空间
 *
 * @author <a href="http://www.origin-x.cn">Lang</a>
 */
public interface Macrocosm {
    /*
     * 环境变量（配置KEY前缀说明）
     * - Z_DEV_           :       开发专用配置
     * - Z_CACHE_         :       缓存专用配置
     */
    // 「Development」开发专用 ---------------------------------------
    /*
     * development:
     *   env:
     *
     * 该配置中存在环境变量和属性的双读取，优先级
     * 1 .env.development           环境变量文件中的值优先（云发布）
     * 2 vertx-deployment.yml       文件中的值次之（默认值）
     *
     */
    String DEV_IO = "Z_DEV_IO";                         // 查看底层IO日志
    String DEV_JOOQ_COND = "Z_DEV_JOOQ_COND";           // 查看 jooq 查询条件日志（等价SQL日志）
    String DEV_EXPR_BIND = "Z_DEV_EXPR_BIND";           // 表达式引擎专用日志打印
    String DEV_EXCEL_RANGE = "Z_DEV_EXCEL_RANGE";       // Excel数据加载扫描日志
    String DEV_JOB_BOOT = "Z_DEV_JOB_BOOT";             // 任务启动专用日志
    String DEV_JVM_STACK = "Z_DEV_JVM_STACK";           // ex.printStackTrace() 异常日志
    String DEV_WEB_URI = "Z_DEV_WEB_URI";               // URI路由检测状况

    String DEV_DAO_BIND = "Z_DEV_DAO_BIND";             // CRUD的 Dao文件绑定

    String DEV_AUTHORIZED = "Z_DEV_AUTHORIZED";         // 认证日志

    /*
     * Zero 系统启动时对应核心环境变量
     * 原始环境变量（新追加，方便协同开发）
     * - Z_API_PORT / Z_API_HOST
     *   Http Server启动端口专用环境变量，如果未设置则选择配置文件中的环境变量
     * - Z_SOCK_PORT / Z_SOCK_HOST
     *   Sock Server启动端口专用环境变量，如果未设置则选择配置文件中的环境变量
     * - Z_DBS_PORT / Z_DBS_HOST / Z_DBS_INSTANCE
     *   数据库专用端口环境变量，如果未设置则选择配置文件中的环境变量（三库同端口：标准库、工作流库、历史库）
     * - Z_DBW_PORT / Z_DBW_HOST / Z_DBW_INSTANCE
     *   工作流数据库专用环境变量，未设置同标准
     * - Z_DBH_PORT / Z_DBH_HOST / Z_DBH_INSTANCE
     *   历史数据库专用环境变量，未设置同标准
     */
    // 「Production」生产专用 ---------------------------------------
    String HED_COMPONENT = "Z_HED";                     // 外置 HED 模块
    String HED_ENABLED = "Z_HED_ENABLED";               // 是否打开 HED 模块
    String SIS_STORE = "Z_SIS_STORE";                   // 集成服务中的存储

    String CACHE_UI = "Z_CACHE_UI";                     // UI缓存
    String CACHE_ADMIT = "Z_CACHE_ADMIT";               // 安全管理缓存
    // 应用环境
    String CORS_DOMAIN = "Z_CORS_DOMAIN";               // 跨域配置（可支持多个，这个作为额外的添加）

    // RESTful 端口号/主机
    String API_PORT = "Z_API_PORT";
    String API_HOST = "Z_API_HOST";

    // WebSocket 端口号/主机
    String SOCK_PORT = "Z_SOCK_PORT";
    String SOCK_HOST = "Z_SOCK_HOST";

    // 数据库端口号/主机
    String DBS_PORT = "Z_DBS_PORT";
    String DBS_HOST = "Z_DBS_HOST";
    String DBS_INSTANCE = "Z_DBS_INSTANCE";

    // 工作流数据库端口号/主机
    String DBW_PORT = "Z_DBW_PORT";
    String DBW_HOST = "Z_DBW_HOST";
    String DBW_INSTANCE = "Z_DBW_INSTANCE";

    // 历史数据库端口号/主机
    String DBH_PORT = "Z_DBH_PORT";
    String DBH_HOST = "Z_DBH_HOST";
    String DBH_INSTANCE = "Z_DBH_INSTANCE";


    // 「Cloud」云端专用 ---------------------------------------
    /*
     * Aeon 系统启用时的核心的环境变量
     * 1. 系统环境变量
     * - AEON_CLOUD：       本地 vertx-zero-cloud 目录，启用 Aeon 系统时，系统会自动生成临时目录：/var/tmp/zero-aeon/kzero，
     *                      启动完成后，临时目录中的相关信息自动同步到环境变量工作目录中
     * - AEON_APP           原来的应用配置路径，用于处理应用程序配置程序加载专用
     *
     * - Z_APP              本地私库 xxx-app 目录，启用 Aeon 系统时，系统会自动生成临时目录：/var/tmp/zero-aeon/kinect，
     *                      启动完成后，临时目录中的相关信息自动同步到环境变量工作目录中标识符统一Z_SIGMA            名空间
     * * - 的在所该应用Z_NS
     * * -
     * - Z_LANG             当前环境使用的系统语言
     *
     */
    String AEON_CLOUD = "AEON_CLOUD";
    String AEON_APP = "AEON_APP";
    String Z_APP = "Z_APP";
    String Z_NS = "Z_NS";
    String Z_TENANT = "Z_TENANT";
    String Z_SIGMA = "Z_SIGMA";
    String Z_LANG = "Z_LANG";

    // For Zero
    String Z_PORT_DB = "Z_PORT_DB";

    // 环境变量打印专用
    static String envContent() {
        final StringBuilder content = new StringBuilder();
        final String[] VARS = new String[]{
            AEON_CLOUD, AEON_APP,               // 云端一阶变量
            Z_NS, Z_APP, Z_LANG, Z_SIGMA,       // 应用一阶变量
            CORS_DOMAIN,                        // 跨域
            API_HOST, API_PORT,                 // RESTful
            SOCK_HOST, SOCK_PORT,               // Sock
            DBS_HOST, DBS_PORT, DBS_INSTANCE,   // DB Service
            DBW_HOST, DBW_PORT, DBW_INSTANCE,   // DB Workflow
            DBH_HOST, DBH_PORT, DBH_INSTANCE,   // DB History
        };
        Arrays.stream(VARS).filter(HUt::isNotNil).forEach(name -> {
            final String value = System.getenv(name);
            content.append("\n\t").append(name).append(" = ").append(value);
        });
        return content.toString();
    }
}
