package com.haobang.config;

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import java.io.File;
import com.typesafe.config.ConfigValueFactory;
import java.nio.charset.Charset;

import java.util.Map;
public class AppConfig {

    private static final Config config;

    static {
        // 加载配置文件
        File configFile = new File("application.properties");
        Config loadedConfig;

        if (configFile.exists()) {
            loadedConfig = ConfigFactory.parseFile(configFile);
        } else {
            loadedConfig = ConfigFactory.load("application.properties");
        }

        // 解析环境变量占位符
        config = resolveEnvironmentVariables(loadedConfig);
    }


    /**
     * 解析环境变量占位符
     */
    private static Config resolveEnvironmentVariables(Config originalConfig) {
        Config resolvedConfig = originalConfig;

        // 遍历所有配置项，查找需要解析的占位符
        for (Map.Entry<String, com.typesafe.config.ConfigValue> entry : originalConfig.entrySet()) {
            String key = entry.getKey();
            String value = originalConfig.getString(key);

            if (value.contains("${")) {
                String resolvedValue = resolvePlaceholder(value);
                resolvedConfig = resolvedConfig.withValue(
                        key,
                        ConfigValueFactory.fromAnyRef(resolvedValue)
                );
            }
        }

        return resolvedConfig;
    }

    /**
     * 解析单个占位符值
     * 格式: ${ENV_VAR:default_value}
     */
    private static String resolvePlaceholder(String value) {
        if (!value.startsWith("${") || !value.endsWith("}")) {
            return value;
        }

        String placeholder = value.substring(2, value.length() - 1);
        String[] parts = placeholder.split(":");

        if (parts.length == 0) {
            return value; // 无效格式，返回原值
        }

        String envVarName = parts[0].trim();
        String defaultValue = parts.length > 1 ? parts[1].trim() : "";

        // 1. 从系统环境变量获取
        String envValue = System.getenv(envVarName);
        if (envValue != null && !envValue.trim().isEmpty()) {
            return envValue.trim();
        }

        // 2. 从系统属性获取 (java -D参数)
        String sysValue = System.getProperty(envVarName);
        if (sysValue != null && !sysValue.trim().isEmpty()) {
            return sysValue.trim();
        }

        // 3. 返回默认值
        return defaultValue;
    }

    // Syslog 配置
    public static int getSyslogTcpPort() {
        return config.getInt("syslog.tcp.port");
    }

    public static int getSyslogUdpPort() {
        return config.getInt("syslog.udp.port");
    }

    public static int getSyslogMaxFrameLength() {
        return config.getInt("syslog.max.frame.length");
    }

    public static int getSyslogBufferSize() {
        return config.getInt("syslog.buffer.size");
    }

    /**
     * syslog 消息字符编码，默认 GBK（国内安全设备普遍使用 GBK）
     * 配置示例: syslog.charset=GBK
     */
    public static Charset getSyslogCharset() {
        if (config.hasPath("syslog.charset")) {
            return Charset.forName(config.getString("syslog.charset"));
        }
        return Charset.forName("GBK");
    }

    // app service  配置
    public static String getAppServieDeviceId() {
        return config.getString("app.service.device_id");
    }
    public static String getAppServieDeviceName() {  return config.getString("app.service.device_name");
    }
    public static String  getAppServieVendor() {
        return config.getString("app.service.vendor");
    }
    public static String getAppServieProductName() {
        return config.getString("app.service.product_name");
    }
    public static String getAppServieDataType() {
        return config.getString("app.service.data_type");
    }
    // kafka 配置
    public static String  getKafkaProducerBootstrap() {
        return config.getString("spring.kafka.producer.bootstrap-servers");
    }
    public static String getKafkaProducerTopic() {
        return config.getString("spring.kafka.producer.topic");
    }

    public static int getDeviceCollectId() {
        return config.getInt("app.service.device_collect_id");
    }

    public static String  getSM4Key() {
        return config.getString("syslog.sm4.generateKey");
    }

}
