#pragma once

#include <cstdint>
#include <string>

namespace minimum_ship_level
{

/** @brief Version components */
struct Version
{
    uint8_t major;
    uint8_t minor;
    uint8_t rev;
};

/** @brief Verify if the current BMC version meets the min ship level
 *  @return true if the verification succeeded, false otherwise
 */
bool verify(const std::string& versionStr);

/** @brief Parse the version components into a struct
 *  @details User passes a version string in regex format (REGEX_BMC_MSL)
 *  at compilation time, this value is break down by parse function to allocate
 *  a struct so it can be compared position by position against the (BMC_MSL)
 *  also defined at compile time.
 * @param[in]  versionStr - The version string to be parsed
 * @param[out] version    - The version struct to be populated
 */
void parse(const std::string& versionStr, Version& version);

/** @brief Compare the versions provided
 *  @param[in] a - The first version to compare
 *  @param[in] b - The second version to compare
 *  @return 1 if a > b
 *          0 if a = b
 *         -1 if a < b
 */
int compare(const Version& a, const Version& b);

/** @brief Check if the minimum ship level option is enabled
 *  @return true if enabled, false otherwise
 */
bool enabled();

/** @brief Get the minimum version
 *  @return[out] msl - Minimum version string
 */
std::string getMinimumVersion();

} // namespace minimum_ship_level