#pragma once

#include <cstdint>
#include <string>

namespace xrpl {

/** Versioning information for this build. */
// VFALCO The namespace is deprecated
namespace BuildInfo {

/** Server version.
    Follows the Semantic Versioning Specification:
    http://semver.org/
*/
std::string const&
getVersionString();

/** Full server version string.
    This includes the name of the server. It is used in the peer
    protocol hello message and also the headers of some HTTP replies.
*/
std::string const&
getFullVersionString();

/** Encode an arbitrary server software version in a 64-bit integer.

    The general format is:

    ........-........-........-........-........-........-........-........
    XXXXXXXX-XXXXXXXX-YYYYYYYY-YYYYYYYY-YYYYYYYY-YYYYYYYY-YYYYYYYY-YYYYYYYY

    X: 16 bits identifying the particular implementation
    Y: 48 bits of data specific to the implementation

    The rippled-specific format (implementation ID is: 0x18 0x3B) is:

    00011000-00111011-MMMMMMMM-mmmmmmmm-pppppppp-TTNNNNNN-00000000-00000000

        M: 8-bit major version (0-255)
        m: 8-bit minor version (0-255)
        p: 8-bit patch version (0-255)
        T: 11 if neither an RC nor a beta
           10 if an RC
           01 if a beta
        N: 6-bit rc/beta number (1-63)

    @param the version string
    @return the encoded version in a 64-bit integer
*/
std::uint64_t
encodeSoftwareVersion(std::string_view versionStr);

/** Returns this server's version packed in a 64-bit integer. */
std::uint64_t
getEncodedVersion();

/** Check if the encoded software version is a rippled software version.

    @param version another node's encoded software version
    @return true if the version is a rippled software version, false otherwise
*/
bool
isRippledVersion(std::uint64_t version);

/** Check if the version is newer than the local node's rippled software
    version.

    @param version another node's encoded software version
    @return true if the version is newer than the local node's rippled software
        version, false otherwise.

    @note This function only understands version numbers that are generated by
        rippled. Please see the encodeSoftwareVersion() function for detail.
*/
bool
isNewerVersion(std::uint64_t version);

}  // namespace BuildInfo

}  // namespace xrpl
