/*
* Copyright 2020 The casbin Authors. All Rights Reserved.
*
* 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.
*/

#include "casbin/pch.h"

#ifndef EVAL_CPP
#define EVAL_CPP

#include <regex>

#include "casbin/util/util.h"

namespace casbin {

std::regex evalReg("\\beval\\(([^)]*)\\)", 
    std::regex_constants::icase);

// HasEval determine whether matcher contains function eval
bool HasEval(const std::string& s) {
    return std::regex_search(s, evalReg);
}

// ReplaceEvalWithMap replace function eval with the value of its parameters via given sets.
std::string ReplaceEvalWithMap(const std::string& src, std::unordered_map<std::string, std::string>& sets) {
    std::string replacedExp = "";
    std::string srcCpy = src;
    std::smatch m;

    while (std::regex_search(srcCpy, m, evalReg)) {
        if (m.empty()) {
            return src;
        }
        std::string key = m[1];
        bool found = sets.find(key) != sets.end();

        replacedExp += m.prefix();
        if (!found) {
            replacedExp += m[0];
        } else {
            replacedExp += sets[key];
        }
        srcCpy = m.suffix();
    }

    replacedExp += srcCpy;

    return replacedExp;
}

// GetEvalValue returns the parameters of function eval
std::vector<std::string> GetEvalValue(std::string s) {
    std::vector<std::string> rules;
    rules.reserve(10);
    std::smatch m;

    while (std::regex_search(s, m, evalReg)) {
        if (m.empty()) {
            return rules;
        }
        std::string rule = m[1];

        rules.push_back(rule);
        s = m.suffix();
    }

    return rules;
}

} // namespace casbin

#endif // EVAL_CPP
