#ifndef THIRD_PARTY_GBMCWEB_DEVPATH_PLUGIN_REDFISH_TO_UHM_TRIE_NODE_H_
#define THIRD_PARTY_GBMCWEB_DEVPATH_PLUGIN_REDFISH_TO_UHM_TRIE_NODE_H_

#include <memory>
#include <string>
#include <string_view>
#include <vector>

#include "absl/container/flat_hash_map.h"
#include "redfish_to_uhm_mapping_value.hpp"
#include "re2/re2.h"

namespace devpath_plugin {

class RedfishToUhmTrieNode {
 public:
  RedfishToUhmTrieNode() = default;

  RedfishToUhmTrieNode(const RedfishToUhmTrieNode&) = delete;
  RedfishToUhmTrieNode& operator=(const RedfishToUhmTrieNode&) = delete;
  RedfishToUhmTrieNode(RedfishToUhmTrieNode&&) = default;
  RedfishToUhmTrieNode& operator=(RedfishToUhmTrieNode&&) = default;

  // Retrieve/create a child node for insertion. Handles regex vs exact matching
  // internally.
  RedfishToUhmTrieNode* GetOrCreateChild(std::string_view segment);

  // Retrieve a matching child node for lookup. Falls back to satisfying regex
  // matching.
  const RedfishToUhmTrieNode* GetChild(std::string_view segment) const;

  void SetValue(const std::shared_ptr<const RedfishToUhmMappingValue>& value) {
    value_ = value;
  }

  std::shared_ptr<const RedfishToUhmMappingValue> GetValue() const {
    return value_;
  }

 private:
  struct RegexChild {
    std::string pattern;
    std::unique_ptr<RE2> regex;
    std::unique_ptr<RedfishToUhmTrieNode> node;
  };

  // Internal helper methods for matching representation
  RedfishToUhmTrieNode* GetOrCreateExactChild(std::string_view segment);
  RedfishToUhmTrieNode* GetOrCreateRegexChild(std::string_view pattern);
  const RedfishToUhmTrieNode* GetExactChild(std::string_view segment) const;
  const RedfishToUhmTrieNode* GetRegexChild(std::string_view segment) const;

  absl::flat_hash_map<std::string, std::unique_ptr<RedfishToUhmTrieNode>>
      exact_children_;
  std::vector<RegexChild> regex_children_;
  std::shared_ptr<const RedfishToUhmMappingValue> value_;
};

}  // namespace devpath_plugin

#endif  // THIRD_PARTY_GBMCWEB_DEVPATH_PLUGIN_REDFISH_TO_UHM_TRIE_NODE_H_
