#include "redfish_subtree_privileges_trie_node.h"

#include <memory>
#include <string_view>
#include <utility>
#include <vector>

#include "absl/container/flat_hash_set.h"
#include "authorizer_enums.h"
#include "redfish_privileges.h"

namespace milotic::authz::internal {

RedfishSubtreePrivilegesTrieNode*
RedfishSubtreePrivilegesTrieNode::GetOrDefaultChild(std::string_view path) {
  std::unique_ptr<RedfishSubtreePrivilegesTrieNode>& node = children_[path];
  if (node == nullptr) {
    node = std::make_unique<RedfishSubtreePrivilegesTrieNode>();
    return node.get();
  }

  return node.get();
}

RedfishSubtreePrivilegesTrieNode* RedfishSubtreePrivilegesTrieNode::GetChild(
    std::string_view path) const {
  auto it = children_.find(path);
  if (it == children_.end()) {
    return nullptr;
  }

  return it->second.get();
}

bool RedfishSubtreePrivilegesTrieNode::ContainsPrivilegeForSubtree(
    const ecclesia::Operation& operation,
    const RedfishPrivileges& privilege) const {
  auto it = subtree_privileges_.find(operation);
  if (it == subtree_privileges_.end()) {
    return false;
  }
  return it->second->contains(privilege);
}

void RedfishSubtreePrivilegesTrieNode::AddPrivilegeForSubtree(
    const ecclesia::Operation& operation, RedfishPrivileges&& privilege) {
  std::unique_ptr<absl::flat_hash_set<RedfishPrivileges>>& privileges =
      subtree_privileges_[operation];
  if (privileges == nullptr) {
    privileges = std::make_unique<absl::flat_hash_set<RedfishPrivileges>>();
  }
  privileges->insert(std::move(privilege));
}

std::vector<RedfishPrivileges>
RedfishSubtreePrivilegesTrieNode::GetPrivilegesForSubtree(
    const ecclesia::Operation& operation) const {
  auto it = subtree_privileges_.find(operation);
  if (it == subtree_privileges_.end()) {
    return std::vector<RedfishPrivileges>();
  }
  return std::vector<RedfishPrivileges>(it->second->begin(), it->second->end());
}

void RedfishSubtreePrivilegesTrieNode::Clear() {
  subtree_privileges_.clear();
  for (auto it = children_.begin(); it != children_.end(); ++it) {
    it->second->Clear();
  }
  children_.clear();
}
}  // namespace milotic::authz::internal
