#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_JSON_UTILS_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_JSON_UTILS_H_

#include <cstddef>
#include <cstdint>
#include <optional>
#include <string>
#include <string_view>

#include "absl/status/statusor.h"
#include <nlohmann/json.hpp>

namespace milotic::authz {

const std::string* GetValueAsStringFromArray(
    const nlohmann::json::array_t& array, std::size_t index);
const std::string* GetValueAsString(const nlohmann::json& root,
                                    std::string_view key);
const std::string* GetValueAsString(
    const nlohmann::json& root, const nlohmann::json::json_pointer& pointer);
const nlohmann::json* GetValueAsJson(const nlohmann::json& root,
                                     std::string_view key);
absl::StatusOr<nlohmann::json> CheckAndGetValueAsJson(
    const nlohmann::json& root, const nlohmann::json::json_pointer& pointer);
const nlohmann::json::array_t* GetValueAsArray(const nlohmann::json& root,
                                               std::string_view key);
nlohmann::json::array_t* GetValueAsMutableArray(nlohmann::json& root,
                                                std::string_view key);
const double* GetValueAsDouble(const nlohmann::json& root,
                               std::string_view key);
const int64_t* GetValueAsInt(const nlohmann::json& root, std::string_view key);
const uint64_t* GetValueAsUint(const nlohmann::json& root,
                               std::string_view key);
const bool* GetValueAsBool(const nlohmann::json& root, std::string_view key);

std::optional<uint64_t> GetValueAsUintFromStringOrInteger(
    const nlohmann::json& root, std::string_view key);
std::optional<double> GetValueAsDoubleFromFloatOrInteger(
    const nlohmann::json& root, std::string_view key);
}  // namespace milotic::authz

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_JSON_UTILS_H_
