#include "managed_store_serialization.h"

#include <cerrno>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <ios>
#include <iterator>
#include <optional>
#include <string>
#include <tuple>
#include <utility>
#include <variant>
#include <vector>

#include "logging.hpp"
#include "nlohmann/json.hpp"
#include "dbus_utility.hpp"
#include "sdbusplus/message/native_types.hpp"

namespace serialize {

using dbus::utility::DbusVariantType;
using dbus::utility::MapperGetObject;
using dbus::utility::MapperGetSubTreePathsResponse;
using dbus::utility::MapperGetSubTreeResponse;
using dbus::utility::MapperServiceMap;
using dbus::utility::SystemdListUnits;
using dbus::utility::SystemdUnitStruct;

enum class Serialize : uint8_t {
  string_type,
  int64_t_type,
  uint64_t_type,
  double_type,
  int32_t_type,
  uint32_t_type,
  uint16_t_type,
  int16_t_type,
  uint8_t_type,
  bool_type,
  size_t_type,
  iter_type,
  tup_type
};

static std::string SerializeToString(enum Serialize in) {
  switch (in) {
    case Serialize::string_type:
      return "string";
    case Serialize::int64_t_type:
      return "int64_t";
    case Serialize::uint64_t_type:
      return "uint64_t";
    case Serialize::double_type:
      return "double";
    case Serialize::int32_t_type:
      return "int32_t";
    case Serialize::uint32_t_type:
      return "uint32_t";
    case Serialize::uint16_t_type:
      return "uint16_t";
    case Serialize::int16_t_type:
      return "int16_t";
    case Serialize::uint8_t_type:
      return "uint8_t";
    case Serialize::bool_type:
      return "bool";
    case Serialize::size_t_type:
      return "size_t";
    case Serialize::iter_type:
      return "iter_type";
    case Serialize::tup_type:
      return "tup";
    default:
      BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize enum value ";
      return "unknown";
  }
}

template <typename T>
nlohmann::json iterate_serialize(const std::vector<T>& in) {
  nlohmann::json arr = nlohmann::json::array();
  for (auto& itor : in) {
    DbusVariantType temp = itor;
    arr.push_back(Serialize(temp));
  }
  return arr;
}

nlohmann::json Serialize(const DbusVariantType& v) {
  nlohmann::json j;

  if (const std::string* pval = std::get_if<std::string>(&v)) {
    j["type"] = "string";
    j["val"] = *pval;
    return j;
  }
  if (const int64_t* pval = std::get_if<int64_t>(&v)) {
    j["type"] = SerializeToString(Serialize::int64_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const uint64_t* pval = std::get_if<uint64_t>(&v)) {
    j["type"] = SerializeToString(Serialize::uint64_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const double* pval = std::get_if<double>(&v)) {
    j["type"] = SerializeToString(Serialize::double_type);
    j["val"] = *pval;
    return j;
  }
  if (const int32_t* pval = std::get_if<int32_t>(&v)) {
    j["type"] = SerializeToString(Serialize::int32_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const uint32_t* pval = std::get_if<uint32_t>(&v)) {
    j["type"] = SerializeToString(Serialize::uint32_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const uint16_t* pval = std::get_if<uint16_t>(&v)) {
    j["type"] = SerializeToString(Serialize::uint16_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const int16_t* pval = std::get_if<int16_t>(&v)) {
    j["type"] = SerializeToString(Serialize::int16_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const uint8_t* pval = std::get_if<uint8_t>(&v)) {
    j["type"] = SerializeToString(Serialize::uint8_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const bool* pval = std::get_if<bool>(&v)) {
    j["type"] = SerializeToString(Serialize::bool_type);
    j["val"] = *pval;
    return j;
  }
  if (const size_t* pval = std::get_if<size_t>(&v)) {
    j["type"] = SerializeToString(Serialize::size_t_type);
    j["val"] = *pval;
    return j;
  }
  if (const std::vector<std::tuple<std::string, std::string, std::string>>* t =
          std::get_if<
              std::vector<std::tuple<std::string, std::string, std::string>>>(
              &v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    j["iterType"] = "v_t_s_s_s";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<std::string>* t =
          std::get_if<std::vector<std::string>>(&v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    j["iterType"] = "v_s";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<double>* t = std::get_if<std::vector<double>>(&v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    j["iterType"] = "v_d";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<uint32_t>* t = std::get_if<std::vector<uint32_t>>(&v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    j["iterType"] = "v_u32";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<uint16_t>* t = std::get_if<std::vector<uint16_t>>(&v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    j["iterType"] = "v_u16";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<std::tuple<std::string, std::string>>* t =
          std::get_if<std::vector<std::tuple<std::string, std::string>>>(&v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    j["iterType"] = "v_t_s_s";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>* t =
          std::get_if<std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>>(
              &v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    ;
    j["iterType"] = "v_t_u32_v_u32";
    j["val"] = iterate_serialize(*t);
    return j;
  }
  if (const std::vector<std::tuple<uint32_t, size_t>>* t =
          std::get_if<std::vector<std::tuple<uint32_t, size_t>>>(&v)) {
    j["type"] = SerializeToString(Serialize::iter_type);
    ;
    j["iterType"] = "v_t_u32_size";
    j["val"] = iterate_serialize(*t);
    return j;
  }

  if (const std::tuple<std::string, std::string, std::string>* t =
          std::get_if<std::tuple<std::string, std::string, std::string>>(&v)) {
    j["type"] = SerializeToString(Serialize::tup_type);
    j["iterType"] = "t_s_s_s";
    nlohmann::json arr = nlohmann::json::array();
    DbusVariantType tmp_var = std::get<0>(*t);
    arr.push_back(Serialize(tmp_var));
    tmp_var = std::get<1>(*t);
    arr.push_back(Serialize(tmp_var));
    tmp_var = std::get<2>(*t);
    arr.push_back(Serialize(tmp_var));
    j["val"] = arr;
    return j;
  }

  if (const std::tuple<std::string, std::string>* t =
          std::get_if<std::tuple<std::string, std::string>>(&v)) {
    j["type"] = SerializeToString(Serialize::tup_type);
    j["iterType"] = "t_s_s";
    nlohmann::json arr = nlohmann::json::array();
    DbusVariantType tmp_var = std::get<0>(*t);
    arr.push_back(Serialize(tmp_var));
    tmp_var = std::get<1>(*t);
    arr.push_back(Serialize(tmp_var));
    j["val"] = arr;
    return j;
  }
  if (const std::tuple<uint32_t, std::vector<uint32_t>>* t =
          std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&v)) {
    j["type"] = SerializeToString(Serialize::tup_type);
    ;
    j["iterType"] = "t_u32_v_u32";
    nlohmann::json arr = nlohmann::json::array();
    DbusVariantType tmp_var = std::get<0>(*t);
    arr.push_back(Serialize(tmp_var));
    tmp_var = std::get<1>(*t);
    arr.push_back(Serialize(tmp_var));
    j["val"] = arr;
    return j;
  }
  /*
   *    TODO deal with sdbusplus::message::object_path,and  size_t
   */
  BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize DbusVariantType, index "
                            << v.index();
  return j;
}

inline DbusVariantType DeserializeIter(nlohmann::json::reference j,
                                       const std::string& type) {
  if (type == "v_t_s_s_s") {
    std::vector<std::tuple<std::string, std::string, std::string>> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::tuple<std::string, std::string, std::string>* pval =
              std::get_if<std::tuple<std::string, std::string, std::string>>(
                  &tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG
            << "unable to deserialize vector tuple string string string";
      }
    }
    return vec;
  }

  if (type == "v_s") {
    std::vector<std::string> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::string* pval = std::get_if<std::string>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector of string";
      }
    }
    return vec;
  }
  if (type == "v_d") {
    std::vector<double> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const double* pval = std::get_if<double>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector double";
      }
    }
    return vec;
  }
  if (type == "v_u32") {
    std::vector<uint32_t> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::uint32_t* pval = std::get_if<uint32_t>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u32";
      }
    }
    return vec;
  }
  if (type == "v_u16") {
    std::vector<uint16_t> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::uint16_t* pval = std::get_if<uint16_t>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u16";
      }
    }
    return vec;
  }
  if (type == "v_t_s_s") {
    std::vector<std::tuple<std::string, std::string>> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::tuple<std::string, std::string>* pval =
              std::get_if<std::tuple<std::string, std::string>>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG
            << "unable to deserialize vector tuple string string";
      }
    }
    return vec;
  }

  if (type == "v_t_u32_v_u32") {
    std::vector<std::tuple<uint32_t, std::vector<uint32_t>>> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::tuple<uint32_t, std::vector<uint32_t>>* pval =
              std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG
            << "unable to deserialize vector tuple uint32 vector uint32";
      }
    }
    return vec;
  }

  if (type == "v_t_u32_size") {
    std::vector<std::tuple<uint32_t, size_t>> vec;
    for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) {
      DbusVariantType tmp = Deserialize(*itor);
      if (const std::tuple<uint32_t, size_t>* pval =
              std::get_if<std::tuple<uint32_t, size_t>>(&tmp)) {
        vec.push_back(*pval);
      } else {
        BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector uint32 size";
      }
    }
    return vec;
  }

  BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown iter type, iterType: "
                            << type;
  return {};
}

inline DbusVariantType DeserializeTup(nlohmann::json::reference j,
                                      const std::string& type) {
  if (type == "t_s_s") {
    std::tuple<std::string, std::string> tup;
    DbusVariantType tmp = Deserialize(j[0]);
    if (const std::string* pval = std::get_if<std::string>(&tmp)) {
      std::get<0>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 0";
    }
    tmp = Deserialize(j[1]);
    if (const std::string* pval = std::get_if<std::string>(&tmp)) {
      std::get<1>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 1";
    }
    return tup;
  }
  if (type == "t_s_s_s") {
    std::tuple<std::string, std::string, std::string> tup;
    DbusVariantType tmp = Deserialize(j[0]);
    if (const std::string* pval = std::get_if<std::string>(&tmp)) {
      std::get<0>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 0";
    }
    tmp = Deserialize(j[1]);
    if (const std::string* pval = std::get_if<std::string>(&tmp)) {
      std::get<1>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 1";
    }
    tmp = Deserialize(j[2]);
    if (const std::string* pval = std::get_if<std::string>(&tmp)) {
      std::get<2>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 2";
    }
    return tup;
  }

  if (type == "t_u32_v_u32") {
    std::tuple<uint32_t, std::vector<uint32_t>> tup;
    DbusVariantType tmp = Deserialize(j[0]);
    if (const uint32_t* pval = std::get_if<uint32_t>(&tmp)) {
      std::get<0>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 0";
    }
    tmp = Deserialize(j[1]);
    if (const std::vector<uint32_t>* pval =
            std::get_if<std::vector<uint32_t>>(&tmp)) {
      std::get<1>(tup) = *pval;
    } else {
      BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 2";
    }
    return tup;
  }

  BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown tuple type, iterType: "
                            << type;
  return {};
}

DbusVariantType Deserialize(nlohmann::json::reference j) {
  try {
    std::string vtype = j["type"];
    BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: vtype: ";
    BMCWEB_LOG_STATEFUL_DEBUG << vtype;
    if (vtype == SerializeToString(Serialize::string_type)) {
      std::string r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::int64_t_type)) {
      int64_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::uint64_t_type)) {
      uint64_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::double_type)) {
      if (j["val"].is_null()) {
        return {0.0};
      }
      double r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::int32_t_type)) {
      int32_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::uint32_t_type)) {
      uint32_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::int16_t_type)) {
      int16_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::uint16_t_type)) {
      uint16_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::uint8_t_type)) {
      uint8_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::bool_type)) {
      bool r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::size_t_type)) {
      size_t r = j["val"];
      return {r};
    }
    if (vtype == SerializeToString(Serialize::iter_type)) {
      nlohmann::json::reference ref = j["val"];
      std::string iter_type = j["iterType"];
      DbusVariantType r = DeserializeIter(ref, iter_type);
      return r;
    }
    if (vtype == SerializeToString(Serialize::tup_type)) {
      nlohmann::json::reference ref = j["val"];
      std::string iter_type = j["iterType"];
      DbusVariantType r = DeserializeTup(ref, iter_type);
      return r;
    }
    BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown Type: " << vtype;
    return {};
  } catch (...) {
    BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: catch ";
    return {};
  }
}

using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>;
using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>;
using ManagedObjectType =
    std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;

nlohmann::json SerializePropMap(DBusPropertiesMap& in) {
  nlohmann::json j;
  j["type"] = "PropMap";
  nlohmann::json arr = nlohmann::json::array();
  for (DBusPropertiesMap::iterator itor = in.begin(); itor != in.end();
       itor++) {
    nlohmann::json tmp;
    tmp["string"] = itor->first;
    DbusVariantType var = itor->second;
    tmp["val"] = Serialize(var);
    arr.push_back(tmp);
  }
  j["val"] = arr;
  return j;
}

DBusPropertiesMap DeserializePropMap(nlohmann::json::reference j) {
  BMCWEB_LOG_STATEFUL_DEBUG << "deserialize propMap" << j.dump();
  DBusPropertiesMap ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    nlohmann::json::reference innerval = (*itor)["val"];
    DbusVariantType tmp_variant = Deserialize(innerval);
    std::pair<std::string, DbusVariantType> tmp = {(*itor)["string"],
                                                   tmp_variant};
    ret.push_back(tmp);
  }
  return ret;
}

nlohmann::json SerializeInterfaceMap(DBusInteracesMap& in) {
  nlohmann::json j;
  j["type"] = "interaceMap";
  nlohmann::json arr = nlohmann::json::array();
  for (DBusInteracesMap::iterator itor = in.begin(); itor != in.end(); itor++) {
    nlohmann::json tmp;
    tmp["string"] = itor->first;
    tmp["val"] = SerializePropMap(itor->second);
    arr.push_back(tmp);
  }
  j["val"] = arr;
  return j;
}

DBusInteracesMap DeserializeInterfaceMap(nlohmann::json::reference& j) {
  DBusInteracesMap ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    nlohmann::json::reference innerval = (*itor)["val"];
    std::pair<std::string, DBusPropertiesMap> tmp = {
        (*itor)["string"], DeserializePropMap(innerval)};
    ret.push_back(tmp);
  }
  return ret;
}

nlohmann::json SerializeObject(ManagedObjectType& in) {
  nlohmann::json j;
  j["type"] = "object";
  nlohmann::json arr = nlohmann::json::array();
  for (ManagedObjectType::iterator itor = in.begin(); itor != in.end();
       itor++) {
    nlohmann::json tmp;
    tmp["string"] = itor->first;
    tmp["val"] = SerializeInterfaceMap(itor->second);
    arr.push_back(tmp);
  }
  j["val"] = arr;
  return j;
}

ManagedObjectType DeserializeObject(nlohmann::json::reference j) {
  ManagedObjectType ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    nlohmann::json::reference innerval = (*itor)["val"];
    std::pair<std::string, DBusInteracesMap> tmp = {
        (*itor)["string"], DeserializeInterfaceMap(innerval)};
    ret.push_back(tmp);
  }
  return ret;
}

nlohmann::json SerializeMapperServiceMap(
    const dbus::utility::MapperServiceMap& in) {
  nlohmann::json j;
  j["type"] = "mapperServiceMap";
  nlohmann::json arr = nlohmann::json::array();
  for (MapperServiceMap::const_iterator itor = in.begin(); itor != in.end();
       itor++) {
    nlohmann::json elem;
    elem["string"] = itor->first;
    nlohmann::json inner_arr = nlohmann::json::array();
    for (std::vector<std::string>::const_iterator inner_itor =
             itor->second.begin();
         inner_itor != itor->second.end(); inner_itor++) {
      nlohmann::json inner_elem;
      inner_elem["type"] = "string";
      inner_elem["val"] = *inner_itor;
      inner_arr.push_back(inner_elem);
    }
    elem["val"] = inner_arr;
    arr.push_back(elem);
  }
  j["val"] = arr;
  return j;
}

MapperServiceMap DeserializeMapperServiceMap(nlohmann::json::reference j) {
  MapperServiceMap ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    std::vector<std::string> inner_tmp = {};

    for (nlohmann::json::iterator inner_itor = (*itor)["val"].begin();
         inner_itor != (*itor)["val"].end(); inner_itor++) {
      inner_tmp.push_back((*inner_itor)["val"]);
    }
    const std::pair<std::string, std::vector<std::string>> tmp = {
        (*itor)["string"], inner_tmp};
    ret.push_back(tmp);
  }
  return ret;
}

nlohmann::json SerializeSubtree(dbus::utility::MapperGetSubTreeResponse& in) {
  nlohmann::json j;
  j["type"] = "subTreeResponse";
  nlohmann::json arr = nlohmann::json::array();
  for (MapperGetSubTreeResponse::iterator itor = in.begin(); itor != in.end();
       itor++) {
    nlohmann::json tmp;
    tmp["string"] = itor->first;
    tmp["val"] = SerializeMapperServiceMap(itor->second);
    arr.push_back(tmp);
  }
  j["val"] = arr;
  return j;
}

MapperGetSubTreeResponse DeserializeSubtree(nlohmann::json::reference j) {
  MapperGetSubTreeResponse ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    nlohmann::json::reference innerval = (*itor)["val"];
    std::pair<std::string, MapperServiceMap> tmp = {
        (*itor)["string"], DeserializeMapperServiceMap(innerval)};
    ret.push_back(tmp);
  }
  return ret;
}

nlohmann::json SerializeSubtreePaths(MapperGetSubTreePathsResponse& in) {
  nlohmann::json j;
  j["type"] = "subTreePathsResponse";
  nlohmann::json arr = nlohmann::json::array();
  for (MapperGetSubTreePathsResponse::iterator itor = in.begin();
       itor != in.end(); itor++) {
    arr.push_back(*itor);
  }
  j["val"] = arr;
  return j;
}

MapperGetSubTreePathsResponse DeserializeSubtreePaths(
    nlohmann::json::reference j) {
  MapperGetSubTreePathsResponse ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    ret.push_back(*itor);
  }
  return ret;
}

// MapperObject is equivalent to MapperServiceMap
nlohmann::json SerializeMapperObject(MapperGetObject& in) {
  return SerializeMapperServiceMap(in);
}

MapperGetObject DeserializeMapperObject(nlohmann::json::reference j) {
  return DeserializeMapperServiceMap(j);
}

nlohmann::json SerializeSystemdUnitStruct(SystemdUnitStruct& in) {
  nlohmann::json j;
  j["type"] = "systemdUnitStruct";
  nlohmann::json::reference val = j["val"];

  // Serialize all parts of the systemd unit struct a(ssssssouso)
  val["name"] = std::get<0>(in);
  val["description"] = std::get<1>(in);
  val["load_state"] = std::get<2>(in);
  val["active_state"] = std::get<3>(in);
  val["substate"] = std::get<4>(in);
  val["followed_unit"] = std::get<5>(in);
  val["unit_path"] = std::get<6>(in).str;
  val["job_id"] = std::get<7>(in);
  val["job_type"] = std::get<8>(in);
  val["job_path"] = std::get<9>(in).str;

  return j;
}

nlohmann::json SerializeSystemdListUnits(SystemdListUnits& in) {
  nlohmann::json j;
  j["type"] = "systemdListUnits";
  nlohmann::json arr = nlohmann::json::array();
  for (SystemdListUnits::iterator itor = in.begin(); itor != in.end(); itor++) {
    arr.push_back(SerializeSystemdUnitStruct(*itor));
  }
  j["val"] = arr;
  return j;
}

SystemdUnitStruct DeserializeSystemdUnitStruct(nlohmann::json::reference j) {
  SystemdUnitStruct ret;
  nlohmann::json::reference val = j["val"];

  return std::make_tuple(
      val["name"], val["description"], val["load_state"], val["active_state"],
      val["substate"], val["followed_unit"],
      sdbusplus::message::object_path(val["unit_path"]), val["job_id"],
      val["job_type"], sdbusplus::message::object_path(val["job_path"]));
}

SystemdListUnits DeserializeSystemdListUnits(nlohmann::json::reference j) {
  SystemdListUnits ret;
  nlohmann::json::reference val = j["val"];
  for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) {
    ret.push_back(DeserializeSystemdUnitStruct(*itor));
  }
  return ret;
}

std::optional<std::string> ReadBinaryFileToString(
    const std::filesystem::path& file) {
  std::ifstream f(file, std::ios_base::in | std::ios::binary);
  if (!f.is_open()) {
    BMCWEB_LOG_STATEFUL_DEBUG << "unable to open file " << file;
    return std::nullopt;
  }
  std::string content{std::istreambuf_iterator<char>(f),
                      std::istreambuf_iterator<char>()};
  if (!f) {
    BMCWEB_LOG_STATEFUL_DEBUG << "unable to read file " << file
                              << strerror(errno);
    return std::nullopt;
  }
  f.close();
  if (!f) {
    BMCWEB_LOG_STATEFUL_DEBUG << "unable to close file " << file
                              << strerror(errno);
    return std::nullopt;
  }
  return content;
}

}  // namespace serialize
