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

#include "dbus_utility.hpp"
#include "nlohmann/json.hpp"

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
