#include <string>
#include <sstream>

#include <divine/utility/version.h>

#if OPT_MPI
#include <mpi.h>
#ifdef HAVE_OMPI_VERSION
#include <ompi/version.h>
#endif
#endif

extern const char *DIVINE_SOURCE_SHA, *DIVINE_BUILD_DATE,
                  *DIVINE_RELEASE_SHA, *DIVINE_VERSION;

namespace divine {

static std::string version;

const char *buildDateString() {
    return DIVINE_BUILD_DATE;
}

const char *versionString() {
    if ( std::string(DIVINE_RELEASE_SHA) == DIVINE_SOURCE_SHA )
        version = std::string( DIVINE_VERSION );
    else
        version = std::string( DIVINE_VERSION ) + "+" + DIVINE_SOURCE_SHA;
    return version.c_str();
}

std::vector< ReportLine > BuildInfo::report() const {
    std::stringstream ss;
#if OPT_MPI
        int vers, subvers;
        std::string impl = "unknown implementation";
        MPI::Get_version( vers, subvers );
#ifdef HAVE_OMPI_VERSION
        impl = std::string( "OpenMPI " ) + OMPI_VERSION;
#endif
        ss << vers << "." << subvers << " (" << impl << ")";
#else
        ss << "n/a";
#endif

    return { { "Version", versionString() },
             { "Build-Date", buildDateString() },
             { "Pointer-Width", std::to_string( 8 * sizeof( void* ) ) },
#ifdef NDEBUG
             { "Debug", "disabled" },
#else
             { "Debug", "enabled" },
#endif
             { "Compile-Flags", divineCompileFlags },
             { "MPI-Version", ss.str() }
           };
}

}