package org.example.Utils;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Arrays;
import java.util.List;

/**
 * Web配置工具类，读取并提供系统配置参数
 * 创 建 者：wzy
 * 创建日期：2015/12/16 15:32:49
 */
@Component
public class WebConfigUtil extends WebConfigUtil_web {

    // 从配置文件读取推送消息开关（默认false）
    @Value("${pushmsg:false}")
    private static boolean pushmsg;

    // 数据库端口
    @Value("${dbport:}")
    private String dbport;

    // 短信用户名（密文）
    @Value("${SMSUserName:}")
    private static String SMSUserName;

    // 短信平台密码（密文）
    @Value("${SMSPwd:}")
    private static String SMSPwd;

    // 基础模块上传图片临时文件夹路径  0填充模块标识，1填充用户id
    public static final String PubModelImgTempPath = "Static/Upload/temp_{1}/temp_{0}";

    // 基础模块用户上传图片临时文件夹路径  0填充用户id
    public static final String PubModelImgCuUserTempPath = "Static/Upload/temp_{0}/";

    // 基础模块附件文件夹，格式：FileRoot\menuCode\Value\fileno\filename
    public static final String PubModelAccFilePath = "{0}/{1}/{2}/";

    // 引导页默认颜色
    private static final List<String> IndexDefaultColors = Arrays.asList(
            "#55bf07", "#01caa2", "#bb6aee", "#199efb",
            "#33b4fe", "#8bc91e", "#1cabed", "#0fc37d"
    );

    // 引导页默认图标
    private static final List<String> IndexDefaultIcons = Arrays.asList(
            "/Resource/Images/indexicon_0.png", "/Resource/Images/indexicon_1.png",
            "/Resource/Images/indexicon_2.png", "/Resource/Images/indexicon_3.png",
            "/Resource/Images/indexicon_4.png", "/Resource/Images/indexicon_5.png",
            "/Resource/Images/indexicon_6.png"
    );

    // 打印连接字符串（懒加载）
    private String _PrintConStr;

    // 数据库连接字符串（从配置文件注入）
    @Value("${spring.datasource.url:}")
    private String connectionString;

    // Getter方法
    public static boolean isPushmsg() {
        return pushmsg;
    }

    public String getDbport() {
        return dbport;
    }

    public static String getSMSUserName() {
        return SMSUserName;
    }

    public static String getSMSPwd() {
        return SMSPwd;
    }

    public static List<String> getIndexDefaultColors() {
        return IndexDefaultColors;
    }

    public static List<String> getIndexDefaultIcons() {
        return IndexDefaultIcons;
    }

    /**
     * 获取打印用的数据库连接字符串（转换为Delphi兼容格式）
     */
    public String getPrintConStr() {
        if (_PrintConStr == null) {
            _PrintConStr = sqlToDephiConStr(ConfigUtil.getConnectionString());
        }
        return _PrintConStr;
    }

    /**
     * 将标准SQL连接字符串转换为Delphi兼容格式
     */
    private String sqlToDephiConStr(String connectionString) {
        if (connectionString == null || connectionString.trim().isEmpty()) {
            return "";
        }

        StringBuilder newConStr = new StringBuilder();
        newConStr.append("Provider=SQLOLEDB.1;");

        String[] parts = connectionString.split(";");
        for (String part : parts) {
            part = part.trim();
            if (part.isEmpty()) {
                continue;
            }

            String[] kv = part.split("=", 2); // 最多分割为2部分
            if (kv.length != 2) {
                continue;
            }

            String key = kv[0].trim().toLowerCase();
            String val = kv[1].trim();

            // 转换关键字并处理特殊值
            switch (key) {
                case "server":
                    key = "Data Source";
                    // 如果是本地服务器，替换为当前主机+端口
                    if (val.equals(".")) {
                        String host = getCurrentHost();
                        val = host + (dbport != null && !dbport.isEmpty() ? "," + dbport : "");
                    }
                    break;
                case "database":
                    key = "Initial Catalog";
                    break;
                case "max pool size":
                    // 移除该参数
                    key = "";
                    break;
                // 其他参数保持不变
            }

            if (!key.isEmpty()) {
                newConStr.append(key).append("=").append(val).append(";");
            }
        }

        return newConStr.toString();
    }

    /**
     * 获取当前请求的主机名
     *
     * @return 主机名
     */
    private static String getCurrentHost() {
        // 从Spring Web上下文获取当前请求
        ServletRequestAttributes requestAttributes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        if (requestAttributes != null) {
            HttpServletRequest request = requestAttributes.getRequest();
            return request.getServerName(); // 返回服务器主机名
        }

        // 非Web环境下返回默认值
        return "localhost";
    }

    /**
     * 获取配置节（Spring环境中通常通过@ConfigurationProperties实现）
     *
     * @param name 配置节名称
     * @return 配置节对象
     */
    public static Object getSection(String name) {
        // Spring环境中建议通过@ConfigurationProperties或@Value注解获取配置
        // 此处为兼容C#方法签名的简化实现
        throw new UnsupportedOperationException("Spring环境中请使用@ConfigurationProperties获取配置节");
    }
}