#include "config.h"

#include "snmp_serialize.hpp"

#include "snmp_client.hpp"

#include <cereal/archives/binary.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/vector.hpp>
#include <phosphor-logging/lg2.hpp>

#include <fstream>

// Register class version
// From cereal documentation;
// "This macro should be placed at global scope"
CEREAL_CLASS_VERSION(phosphor::network::snmp::Client, CLASS_VERSION);

namespace phosphor
{
namespace network
{
namespace snmp
{

/** @brief Function required by Cereal to perform serialization.
 *  @tparam Archive - Cereal archive type (binary in our case).
 *  @param[in] archive - reference to Cereal archive.
 *  @param[in] manager - const reference to snmp manager info.
 *  @param[in] version - Class version that enables handling
 *                       a serialized data across code levels
 */
template <class Archive>
void save(Archive& archive, const Client& manager,
          const std::uint32_t /*version*/)
{
    archive(manager.address(), manager.port());
}

/** @brief Function required by Cereal to perform deserialization.
 *  @tparam Archive - Cereal archive type (binary in our case).
 *  @param[in] archive - reference to Cereal archive.
 *  @param[in] manager - reference to snmp manager info.
 *  @param[in] version - Class version that enables handling
 *                       a serialized data across code levels
 */
template <class Archive>
void load(Archive& archive, Client& manager, const std::uint32_t /*version*/)
{
    std::string ipaddress{};
    uint16_t port{};

    archive(ipaddress, port);

    manager.address(ipaddress);
    manager.port(port);
}

fs::path serialize(Id id, const Client& manager, const fs::path& dir)
{
    fs::path fileName = dir;
    fs::create_directories(dir);
    fileName /= std::to_string(id);

    std::ofstream os(fileName.string(), std::ios::binary);
    cereal::BinaryOutputArchive oarchive(os);
    oarchive(manager);
    return fileName;
}

bool deserialize(const fs::path& path, Client& manager)
{
    try
    {
        if (fs::exists(path))
        {
            std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
            cereal::BinaryInputArchive iarchive(is);
            iarchive(manager);
            return true;
        }
        return false;
    }
    catch (const cereal::Exception& e)
    {
        lg2::error("Deserialization failed: {ERROR}", "ERROR", e);
        std::error_code ec;
        fs::remove(path, ec);
        return false;
    }
    catch (const fs::filesystem_error& e)
    {
        return false;
    }
}

} // namespace snmp
} // namespace network
} // namespace phosphor
