#!/bin/sh
# PURPOSE:	qcdate: convert <YYYY-MM-DD> into MJD and vice versa
# AUTHOR:	Stefano Zampieri, Burkhard Wolff
# VERSIONS:	1.0 -- original version in C, by S. Zampieri (2004)
#		2.0 -- rewritten as shell script (change of OS) (2018-04-20)
#		2.0.1- fix issue with dates like 2018-09-31 where 09 is interpreted as octal number (2019-02-04)
#		2.0.2- fix issues with MJD values like 60101 which are interpreted by the UNIX date -d as 1st Jan 6 (2023-06-22)
#
# PARAMETERS:	<YYYY-MM-DD> | <YYYY-MM-DD> <+/-offset> | <MJD> | <MJD> <+/-offset>
# =========================================================================
TOOL_VERSION="2.0.2"

# =============================================================================
# 0. get options
# =============================================================================

# define help
cat > $TMP_DIR/qcdate.h <<EOT
USAGE:
	qcdate -v | -h
	convert <YYYY-MM-DD> into MJD and vice versa:
	qcdate <YYYY-MM-DD>			convert to MJD
	qcdate <YYYY-MM-DD> <+/-offset>		apply offset (days), output in YYYY-MM-DD format
	qcdate <MJD>				convert to YYYY-MM-DD
	qcdate <MJD> <+/-offset>		apply offset (days) and convert to YYYY-MM-DD format
EOT

# get options
while getopts :hv OPTION
do
	case "$OPTION" in
		v) echo "$TOOL_VERSION"
		   exit 0 ;;
		h) cat $TMP_DIR/qcdate.h
		   exit 0 ;;
	esac
done

# =============================================================================
# 1. main
# =============================================================================

MJD_1970=40587
SECS_DAY=86400

if [ -z "$1" ]; then
    cat $TMP_DIR/qcdate.h
    exit 1
fi

date=$1
# parse offset. default zero when argument not present.
printf -v offset "%.0f" $2
if [ $? -ne 0 ]; then
    echo "ERROR"
    exit 1
fi

# v2.0.2: check date format
case $date in
	*"-"*) FLAG_MJDOBS=0;;
	*) FLAG_MJDOBS=1;;
esac

# assume date format: YYYY-MM-DD
if [ $FLAG_MJDOBS -eq 0 ]; then
    unixTime=`date -u -d $date +%s 2>&1`
    if [  $? -ne 0 ]
    then
	    echo ERROR
	    exit 1
    fi
    if [ $offset -ne 0 ]; then
	newTime=$(($unixTime + $offset * $SECS_DAY))
	date -u -d @$newTime +%Y-%m-%d
    else
	echo $(($MJD_1970 + $unixTime / $SECS_DAY))
    fi
    exit 0
fi

# assume date format: MJD
date=`echo $date | sed "s/\./ /" | awk '{print $1}'`
# leading 0: number is interpeted as octal, gives error for 08 and 09 !!!
date=`echo $date | sed "s/\./ /" | awk '{print $1}' | sed "s/-0*/-/g" | sed "s/+0*/+/g"`
unixTime="$((($date - $MJD_1970 + $offset) * $SECS_DAY))"
if [ $unixTime -gt 0 ]; then
    date -u -d @$unixTime +%Y-%m-%d
    exit 0
fi

echo "ERROR"
exit 1
