package com.ff.base.utils.nginx;

import com.alibaba.fastjson2.JSON;
import com.ff.base.constant.ConfigConstants;
import com.ff.base.datasource.DynamicDataSourceContextHolder;
import com.ff.base.system.service.ISysConfigService;
import com.ff.base.utils.file.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.PropertyPlaceholderHelper;

import javax.annotation.Resource;
import java.util.Map;

/**
 * nginx utils
 *
 * @author shi
 * @date 2025/01/21
 */
@Component
@Slf4j
public class NginxUtils {

    @Resource
    private ISysConfigService sysConfigService;


    /**
     * 创建配置
     */
    public Boolean createDomainNginxConfig(String domainName) {

        // 从系统配置中获取 nginx 配置参数
        Map<String, String> param = JSON.parseObject(sysConfigService.selectConfigByKey(ConfigConstants.DOMAIN_NGINX_CONFIG_PARAM), Map.class);
        // 遍历 Map 并替换占位符
        for (Map.Entry<String, String> entry : param.entrySet()) {
            // 根据 domainName 更新配置值
            String updatedValue = String.format(entry.getValue(), domainName);
            // 首先，确保目录存在
            FileUtils.checkAndCreateDirectory(updatedValue);
            // 然后，确保文件存在
            FileUtils.createFileIfNotExists(updatedValue);
            // 更新 Map 中的值
            param.put(entry.getKey(), updatedValue);
        }
        // 添加 serverName 到配置中
        param.put("serverName", domainName);
        // 获取域名 nginx 配置
        String domainNginxConfig = sysConfigService.selectConfigByKey(ConfigConstants.DOMAIN_NGINX_CONFIG);
        // 创建一个属性占位符帮助类实例
        PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");
        // 使用 param 中的值替换配置中的占位符
        String result = helper.replacePlaceholders(domainNginxConfig, param::get);
        // 打印替换后的配置
        System.out.printf(result);

        // 将生成的内容保存到文件中
        String filePath = param.get("confUrl");
        // 将配置内容写入文件
        Boolean writeToFile = FileUtils.writeToFile(filePath, result);
        // 如果写入文件失败，则返回 false
        if (!writeToFile) {
            return writeToFile;
        }
        // 执行 shell 脚本，以完成进一步的配置
        FileUtils.executeShellScript(param.get("shUrl"), param.get("rootUrl"), DynamicDataSourceContextHolder.getDataSourceType(), param.get("appUrl"));

        // 返回 true 表示配置成功
        return Boolean.TRUE;


    }

    /**
     * 删除域nginx配置
     *
     * @param domainName 域名
     * @return {@link Boolean }
     */
    public Boolean deleteDomainNginxConfig(String domainName) {
        // 从系统配置服务中获取 nginx 配置参数的 JSON 字符串，并解析为 Map 对象
        Map<String, String> param = JSON.parseObject(sysConfigService.selectConfigByKey(ConfigConstants.DOMAIN_NGINX_CONFIG_PARAM), Map.class);
        // 遍历 Map 并替换占位符
        for (Map.Entry<String, String> entry : param.entrySet()) {
            // 使用 domainName 参数格式化 Map 中的每个值
            String updatedValue = String.format(entry.getValue(), domainName);
            // 删除格式化后的文件路径对应的文件
            FileUtils.deleteFile(updatedValue);
        }
        // 返回 true 表示操作成功
        return Boolean.TRUE;
    }
}
