package com.yangdb.es.plugins.script.regex;

/*-
 *
 * es-plugin
 * %%
 * Copyright (C) 2016 - 2019 yangdb   ------ www.yangdb.org ------
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class RegexUtil {
    public static String wildcardToRegex(String wildcardExpression) {
        StringBuilder regexStringBuilder = new StringBuilder();

        boolean isEscapedPreviousChar = false;
        for(char c : wildcardExpression.toCharArray()) {
            if (!isEscapedPreviousChar) {
                switch (c) {
                    case '\\':
                        isEscapedPreviousChar = true;
                        regexStringBuilder.append('\\');
                        break;
                    case '*':
                        regexStringBuilder.append(".*");
                        break;
                    case '?':
                        regexStringBuilder.append(".");
                        break;
                    default:
                        if (regexSpecialChars.contains(c)) {
                            regexStringBuilder.append('\\');
                        }

                        regexStringBuilder.append(c);
                }
            } else {
                if (!wildcardSpecialChars.contains(c)) {
                    regexStringBuilder.append('\\');
                }

                regexStringBuilder.append(c);

                isEscapedPreviousChar = false;
            }
        }

        return regexStringBuilder.toString();
    }

    //region Fields
    private static Set<Character> wildcardSpecialChars = new HashSet<>(Arrays.asList('*', '?'));
    private static Set<Character> regexSpecialChars = new HashSet<>(Arrays.asList('.', '*', '+', '^', '[', ']', '{', '}', '(', ')', '$', '|', '?', '\\'));
    //endregion
}
