/** @file ppMergeVersion.c
 *
 *  @brief
 *
 *  @ingroup ppMerge
 *
 *  @author IfA
 *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
 *  @date $Date: 2009-02-01 21:43:05 $
 *  Copyright 2009 Institute for Astronomy, University of Hawaii
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <pslib.h>
#include <psmodules.h>
#include <ppStats.h>

#include "ppMergeVersion.h"

psString ppMergeVersion(void)
{
#ifndef PPMERGE_VERSION
#error "PPMERGE_VERSION is not set"
#endif
#ifndef PPMERGE_BRANCH
#error "PPMERGE_BRANCH is not set"
#endif
    return psStringCopy(PPMERGE_BRANCH "@" PPMERGE_VERSION);
}

psString ppMergeSource(void)
{
#ifndef PPMERGE_SOURCE
#error "PPMERGE_SOURCE is not set"
#endif
    return psStringCopy(PPMERGE_SOURCE);
}

psString ppMergeVersionLong(void)
{
    psString version = ppMergeVersion();  // Version, to return
    psString source = ppMergeSource();    // Source

    psStringPrepend(&version, "ppMerge ");
    psStringAppend(&version, " from %s, built %s, %s", source, __DATE__, __TIME__);
    psFree(source);

#ifdef __OPTIMIZE__
    psStringAppend(&version, " optimised");
#else
    psStringAppend(&version, " unoptimised");
#endif

    return version;
};

void ppMergeVersionMetadata(psMetadata *metadata)
{
    PS_ASSERT_METADATA_NON_NULL(metadata,);

    psString pslib = psLibVersionLong();///< psLib version
    psString psmodules = psModulesVersionLong(); ///< psModules version
    psString ppStats = ppStatsVersionLong(); ///< ppStats version
    psString ppMerge = ppMergeVersionLong(); ///< ppMerge version

    psTime *time = psTimeGetNow(PS_TIME_TAI); ///< The time now
    psString timeString = psTimeToISO(time); ///< The time in an ISO string
    psFree(time);
    psString head = NULL;               ///< Head string
    psStringAppend(&head, "ppMerge processing at %s. Component information:", timeString);
    psFree(timeString);

    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, head, "");
    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, pslib, "");
    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, psmodules, "");
    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, ppStats, "");
    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, ppMerge, "");

    psFree(head);
    psFree(pslib);
    psFree(psmodules);
    psFree(ppStats);
    psFree(ppMerge);

    return;
}
