#include "redfish_to_uhm_trie_node.hpp"

#include <memory>
#include <string>
#include <string_view>
#include <utility>

#include "re2/re2.h"

namespace devpath_plugin {

namespace {

bool IsRegexSegment(std::string_view segment) {
  return segment.find_first_of("[]*+?|()^$\\") != std::string_view::npos;
}

}  // namespace

RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetOrCreateChild(
    std::string_view segment) {
  if (IsRegexSegment(segment)) {
    return GetOrCreateRegexChild(segment);
  }
  return GetOrCreateExactChild(segment);
}

const RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetChild(
    std::string_view segment) const {
  const RedfishToUhmTrieNode* next = GetExactChild(segment);
  if (next != nullptr) {
    return next;
  }
  return GetRegexChild(segment);
}

RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetOrCreateExactChild(
    std::string_view segment) {
  std::unique_ptr<RedfishToUhmTrieNode>& child = exact_children_[segment];
  if (!child) {
    child = std::make_unique<RedfishToUhmTrieNode>();
  }
  return child.get();
}

RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetOrCreateRegexChild(
    std::string_view pattern) {
  for (const auto& child : regex_children_) {
    if (child.pattern == pattern) {
      return child.node.get();
    }
  }
  auto new_node = std::make_unique<RedfishToUhmTrieNode>();
  RedfishToUhmTrieNode* raw_node = new_node.get();
  regex_children_.push_back(RegexChild{
      std::string(pattern),
      std::make_unique<RE2>(pattern),
      std::move(new_node),
  });
  return raw_node;
}

const RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetExactChild(
    std::string_view segment) const {
  auto it = exact_children_.find(segment);
  if (it == exact_children_.end()) {
    return nullptr;
  }
  return it->second.get();
}

const RedfishToUhmTrieNode* RedfishToUhmTrieNode::GetRegexChild(
    std::string_view segment) const {
  for (const auto& child : regex_children_) {
    if (child.regex && RE2::FullMatch(segment, *child.regex)) {
      return child.node.get();
    }
  }
  return nullptr;
}

}  // namespace devpath_plugin
