package com.sqx.modules.errand.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 短信模板变量工具类
 */
public class SmsTemplateValUtil {

    /**
     * 模板占位符
     */
    public static final String TEMPLATE_HOLD = "\\$\\{%s}";

    /**
     * 模板正则表达式
     */
    public static final Pattern PATTERN = Pattern.compile("\\$\\{(.*?)\\}");

    /**
     * 当前支持的变量名称列表
     */
    public static final List<String> SUPPORT_VAL_NAME_LIST = Arrays.asList("currentUserPhone", "currentUserName");

    /**
     * 获取text中的自定义变量名称
     * @param text 例如：这是一条测试短信，验证码为 ${code}。 可以把code提取出来
     * @return
     */
    public static List<String> getTemplateValName(String text) {
        Matcher matcher = PATTERN.matcher(text);

        List<String> valNames = new ArrayList<>();
        while (matcher.find()) {
            valNames.add(matcher.group(1));
        }

        return valNames;
    }

    /**
     * 校验text中自定义变量名称
     * @param text
     * @return
     */
    public static boolean checkText(String text) {
        List<String> templateValName = getTemplateValName(text);
        for (String valName : templateValName) {
            if (!SUPPORT_VAL_NAME_LIST.contains(valName)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 模板参数替换
     * @param text  模板内容
     * @param value 动态参数
     * @return
     */
    public static String replaceTemplateVal(String text, Map<String, String> value) {
        final String[] finalText = {text};
        value.keySet().forEach(key -> {
            finalText[0] = finalText[0].replaceAll(String.format(TEMPLATE_HOLD, key), value.get(key));
        });
        return finalText[0];
    }
}
