package cn.ezhizao.common.utils.bean;

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

public class MethodSignatureMatcher {

    // 正则表达式匹配方法参数列表
    private static final Pattern PARAMETER_LIST_PATTERN = Pattern.compile("\\((.*)\\)");

    // 分割字符串参数的正则表达式
    private static final Pattern SPLIT_PARAMETER_PATTERN = Pattern.compile("\\s*,\\s*");

    /**
     * 检查字符串参数列表是否与方法签名匹配
     * @param methodSignature 方法签名
     * @param parameterListStr 参数列表字符串
     * @return 如果匹配返回true，否则返回false
     */
    public static boolean matchParameterList(String methodSignature, String parameterListStr) {
        Matcher signatureMatcher = PARAMETER_LIST_PATTERN.matcher(methodSignature);
        if (signatureMatcher.find()) {
            String expectedParameters = signatureMatcher.group(1);
            List<String> expectedParameterTypes = splitParameters(expectedParameters);
            List<String> actualParameterTypes = splitParameters(parameterListStr);
            return expectedParameterTypes.equals(actualParameterTypes);
        }
        return false;
    }

    /**
     * 分割参数字符串为参数类型列表
     * @param parameterStr 参数字符串
     * @return 参数类型列表
     */
    public static List<String> splitParameters(String parameterStr) {
        List<String> parameters = new ArrayList<>();
        Matcher splitMatcher = SPLIT_PARAMETER_PATTERN.matcher(parameterStr);
        splitMatcher.reset();
        while (splitMatcher.find()) {
            String parameter = splitMatcher.group();
            if (!parameter.trim().isEmpty()) {
                parameters.add(parameter.trim());
            }
        }
        return parameters;
    }
}