
#include <filesystem>
#include <optional>
#include <string>
#include <vector>

#include "nlohmann/json.hpp"
#include "dbus_utility.hpp" // NOLINT
#include "async_resp.hpp" // NOLINT
#include "http_request.hpp" // NOLINT

namespace serialize {
// Serializes a serialize_prop_map into json
nlohmann::json SerializePropMap(dbus::utility::DBusPropertiesMap& in);
// Deserializes json into a DBusPropertiesMap
dbus::utility::DBusPropertiesMap DeserializePropMap(
    nlohmann::json::reference j);

// Serializes a interface map into json
nlohmann::json SerializeInterfaceMap(dbus::utility::DBusInteracesMap& in);
// Deserializes json into a interfacemap
dbus::utility::DBusInteracesMap DeserializeInterfaceMap(
    nlohmann::json::reference j);

// Serializes a ManagedObjectType into json
nlohmann::json SerializeObject(dbus::utility::ManagedObjectType& in);
// Deserializes json into a ManagedObjectType
dbus::utility::ManagedObjectType DeserializeObject(
    nlohmann::json::reference j);

// Serializes a MapperServiceMap into json
nlohmann::json SerializeMapperServiceMap(
    const dbus::utility::MapperServiceMap& in);

// Deserializes json into a MapperServiceMap
dbus::utility::MapperServiceMap DeserializeMapperServiceMap(
    nlohmann::json::reference j);

// Serializes a Subtree into json
nlohmann::json SerializeSubtree(dbus::utility::MapperGetSubTreeResponse& in);

// Deserializes json into a Subtree
dbus::utility::MapperGetSubTreeResponse DeserializeSubtree(
    nlohmann::json::reference j);

// Serializes a SubtreePaths into json
nlohmann::json SerializeSubtreePaths(
    dbus::utility::MapperGetSubTreePathsResponse& in);

// Deserializes json into a Subtree
dbus::utility::MapperGetSubTreePathsResponse DeserializeSubtreePaths(
    nlohmann::json::reference j);

// Serializes a MapperObject into json
nlohmann::json SerializeMapperObject(
    dbus::utility::MapperGetObject& in);

// Deserializes json into a MapperObject
dbus::utility::MapperGetObject DeserializeMapperObject(
    nlohmann::json::reference j);

// Serialize a SystemListUnit
nlohmann::json SerializeSystemdUnitStruct(
    dbus::utility::SystemdUnitStruct& in);

// Serializes a SystemdListUnits into json
nlohmann::json SerializeSystemdListUnits(
    dbus::utility::SystemdListUnits& in);

// Deserializes json into a SystemdUnitStruct
dbus::utility::SystemdUnitStruct DeserializeSystemdUnitStruct(
    nlohmann::json::reference j);

// Deserializes json into a SystemdListUnits
dbus::utility::SystemdListUnits DeserializeSystemdListUnits(
    nlohmann::json::reference j);

// serialize a DBusVariantType into json
nlohmann::json Serialize(const dbus::utility::DbusVariantType& v);

// Serializes a vector of DBusVariantType into json
template <typename t>
nlohmann::json IterateSerialize(const std::vector<t>& in);

// Deserializes json into a DBusVariantType
dbus::utility::DbusVariantType Deserialize(nlohmann::json::reference j);

// Deserializes an iterable container of DbusVariantType
inline dbus::utility::DbusVariantType DeserializeIter(
    nlohmann::json::reference j, const std::string& type);

// Deserializes an tuple container of DbusVariantType
inline dbus::utility::DbusVariantType DeserializeTup(
    nlohmann::json::reference j, const std::string& type);

// Reads a binary file into a string, or returns no value on error
std::optional<std::string> ReadBinaryFileToString(
    const std::filesystem::path& file);
}  // Namespace serialize
