#!/bin/bash
VERSION_IN_FILE=$1
OUT_FIELD_NAME=$2

#
# Handles input file regardless of if version string has trailing whitespace or
# windows or mac or unix line termination.
#
# Produces output with no line termination
#
# Example usage:
#	sh ScriptsLib/ExtractVersionInformation STROIKA_VERSION  FullVersionString
#	sh ScriptsLib/ExtractVersionInformation STROIKA_VERSION  Major
#	sh ScriptsLib/ExtractVersionInformation STROIKA_VERSION  Major.Minor
#
# Allowed Field Names:
#		FullVersionString
#		Major
#		Minor
#		Stage
#		SubStage
#		Major.Minor
#		DecoratedStageInfo
#		Win32FourDot
#		FinalBuild
#

#echo "-----------"
#echo VERSION_IN_FILE=$VERSION_IN_FILE
#echo OUT_FIELD_NAME=$OUT_FIELD_NAME
#echo "-----------"


SED=sed
# for crapple, brew install gnu-sed
if [[ `uname` == 'Darwin' ]] ; then SED=gsed; fi


FULLVERSIONSTRING=`$SED 's/[ \t]*$//' $VERSION_IN_FILE | xargs echo -n | tr -d '[[:space:]]'`
MAJOR=`$SED 's/\([0-9]*\).*/\1/' $VERSION_IN_FILE`
MINOR=`$SED 's/[0-9]*\.\([0-9]*\).*/\1/' $VERSION_IN_FILE`
VERSIONSTAGE=`$SED 's/[0-9]*\.[0-9]*\([abdr\.]\?\).*/\1/' $VERSION_IN_FILE`
VERSIONSUBSTAGE=`$SED 's/[0-9]*\.[0-9]*[abdr\.]\?\([0-9]*\).*/\1/' $VERSION_IN_FILE`
if [ "$VERSIONSUBSTAGE" == "" ] ; then VERSIONSUBSTAGE="0"; fi
VERSIONFINAL=`$SED 's/[0-9]*\.[0-9]*[abdr\.]\?[0-9]*\(.*\)/\1/' $VERSION_IN_FILE | tr -d '[[:space:]]'`
SHORT_VERSION_STAGE=$VERSIONSTAGE
SHORT_VERSIONFINAL=$VERSIONFINAL
if [ "$VERSIONSTAGE" == "a" ] ; then VERSIONSTAGE="Alpha"; fi
if [ "$VERSIONSTAGE" == "b" ] ; then VERSIONSTAGE="Beta"; fi
if [ "$VERSIONSTAGE" == "d" ] ; then VERSIONSTAGE="Dev"; fi
if [ "$VERSIONSTAGE" == "r" ] ; then VERSIONSTAGE="ReleaseCandidate"; fi
if [ "$VERSIONSTAGE" == "." ] ; then VERSIONSTAGE="Release"; fi
if [ "$VERSIONSTAGE" == "" ] ; then VERSIONSTAGE="Release"; fi

if [ "$VERSIONFINAL" == "x" ] ; then VERSIONFINAL="false"; fi
if [ "$VERSIONFINAL" == "" ] ; then VERSIONFINAL="true"; fi
if [ "$VERSIONFINAL" != "false" ] && [ "$VERSIONFINAL" != "true" ] ; then echo "BAD VERSIONFINAL"; fi

VERSIONFINALBUILD='0'
if [ "$VERSIONFINAL" == "true" ] ; then VERSIONFINALBUILD="1"; fi

if [ "$OUT_FIELD_NAME" == "FullVersionString" ]
  then
	echo -n "$FULLVERSIONSTRING"
fi
if [ "$OUT_FIELD_NAME" == "Major" ]
  then
	echo -n "$MAJOR"
fi
if [ "$OUT_FIELD_NAME" == "Minor" ]
  then
	echo -n "$MINOR"
fi
if [ "$OUT_FIELD_NAME" == "Stage" ]
  then
	echo -n "$VERSIONSTAGE"
fi
if [ "$OUT_FIELD_NAME" == "SubStage" ]
  then
	echo -n "$VERSIONSUBSTAGE"
fi
if [ "$OUT_FIELD_NAME" == "Final" ]
  then
	echo -n "$VERSIONFINAL"
fi
if [ "$OUT_FIELD_NAME" == "Major.Minor" ]
  then
	echo -n "$MAJOR.$MINOR"
fi
if [ "$OUT_FIELD_NAME" == "DecoratedStageInfo" ]
  then
	echo -n "$SHORT_VERSION_STAGE$VERSIONSUBSTAGE$SHORT_VERSIONFINAL"
fi
if [ "$OUT_FIELD_NAME" == "Win32FourDot" ]
  then
	echo -n "$MAJOR.$MINOR.";
	thirdOctet=0;
	if [ "$VERSIONSTAGE" == "Dev" ] ; then thirdOctet=32; fi;
	if [ "$VERSIONSTAGE" == "Alpha" ] ; then thirdOctet=64; fi;
	if [ "$VERSIONSTAGE" == "Beta" ] ; then thirdOctet=96; fi;
	if [ "$VERSIONSTAGE" == "ReleaseCandidate" ] ; then thirdOctet=128; fi;
	if [ "$VERSIONSTAGE" == "Release" ] ; then  thirdOctet=160; fi;
	# see Version::AsWin32Version4DotString () - (fVerStage) << 5) | (fVerSubStage >> 7)
	thirdOctet=$(($thirdOctet + ($VERSIONSUBSTAGE>>7)))
	echo -n "$thirdOctet."
	# see Version::AsWin32Version4DotString () -  (fVerSubStage & 0x7f) << 1) | static_cast<uint8_t> (fFinalBuild)
	fourthOctet=$((($VERSIONSUBSTAGE & 0x7f) << 1))
	if [ "$VERSIONFINAL" == "" ] ; then fourthOctet = $(($fourthOctet + 1)); fi
	echo -n "$fourthOctet"
fi
if [ "$OUT_FIELD_NAME" == "FinalBuild" ]
  then
	echo -n "$VERSIONFINAL"
fi
