package com.agent.management.engine;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * {{变量名}} 模板渲染器。
 *
 * <p>支持：
 * <ul>
 *   <li>{@code {{varName}}} — 直接引用当前工作区变量</li>
 *   <li>{@code {{nodeId.varName}}} — 引用指定节点输出变量（内部映射为 {@code nodeId__varName}）</li>
 *   <li>{@code {{nodeId.var.path}}} — 引用指定节点输出变量的嵌套 JSON 路径</li>
 * </ul>
 * 变量不存在时保留原始占位符，不报错。
 */
public class TemplateRenderer {

    /** 匹配 {{...}}，内部允许字母、数字、下划线、点号、中横线 */
    private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\{\\{([^{}\\s]+)}}");

    public static String render(String template, Map<String, Object> variables) {
        if (template == null || template.isEmpty()) return "";
        if (variables == null || variables.isEmpty()) return template;

        Matcher matcher = TEMPLATE_PATTERN.matcher(template);
        StringBuilder sb = new StringBuilder();
        while (matcher.find()) {
            String varExpr = matcher.group(1).trim();
            Object value = resolveValue(varExpr, variables);
            String replacement = (value != null) ? Matcher.quoteReplacement(value.toString()) : matcher.group(0);
            matcher.appendReplacement(sb, replacement);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    private static Object resolveValue(String varExpr, Map<String, Object> variables) {
        // 无命名空间前缀：直接变量表
        if (!varExpr.contains(".")) {
            return variables.get(varExpr);
        }

        // nodeId.var.path 语法：把第一级前缀转为 nodeId__ 后再按 JsonPath 取值
        int firstDot = varExpr.indexOf('.');
        String nodeId = varExpr.substring(0, firstDot);
        String rest = varExpr.substring(firstDot + 1);
        String lookupKey = nodeId + NodeWorkspaceBuilder.NODE_FIELD_SEPARATOR + rest;
        Object value = JsonPathExtractor.extract(variables, lookupKey);
        if (value != null) {
            return value;
        }

        // 兜底：尝试把完整点号表达式当作扁平 key
        return variables.get(varExpr);
    }
}
