#pragma once

#include "config.h"

#include "version.hpp"

#include <string>

namespace phosphor
{
namespace software
{
namespace updater
{

using VersionPurpose =
    sdbusplus::xyz::openbmc_project::Software::server::Version::VersionPurpose;

/** @brief Serialization function - stores priority information to file
 *  @param[in] flashId - The flash id of the version for which to store
 *                       information.
 *  @param[in] priority - RedundancyPriority value for that version.
 **/
void storePriority(const std::string& flashId, uint8_t priority);

/** @brief Serialization function - stores purpose information to file
 *  @param[in] flashId - The flash id of the version for which to store
 *                       information.
 *  @param[in] purpose - VersionPurpose value for that version.
 **/
void storePurpose(const std::string& flashId, VersionPurpose purpose);

/** @brief Serialization function - restores priority information from file
 *  @param[in] flashId - The flash id of the version for which to retrieve
 *                       information.
 *  @param[in] priority - RedundancyPriority reference for that version.
 *  @return true if restore was successful, false if not
 **/
bool restorePriority(const std::string& flashId, uint8_t& priority);

/** @brief Serialization function - restores purpose information from file
 *  @param[in] flashId - The flash id of the version for which to retrieve
 *                       information.
 *  @param[in] purpose - VersionPurpose reference for that version.
 *  @return true if restore was successful, false if not
 **/
bool restorePurpose(const std::string& flashId, VersionPurpose& purpose);

/** @brief Removes the serial directory for a given version.
 *  @param[in] flash Id - The flash id of the version for which to remove a
 *                        file, if it exists.
 **/
void removePersistDataDirectory(const std::string& flashId);

} // namespace updater
} // namespace software
} // namespace phosphor
