#!/bin/bash

#defaults  set in defaults.conf
#GX_CLOSING_LOGOFF_MINUTES=0
#GX_CLOSING_LAST_WARNING_MINUTES=5
#GX_CLOSING_WARNING_MINUTES=10

#GX_CLOSING_LOGOFF_MESSAGE="This computer is shutting down now!"
#GX_CLOSING_LAST_WARNING_MESSAGE="This computer is shutting down in GX_VAR minutes. Please complete your session and logout."
#GX_CLOSING_WARNING_MESSAGE="This computer is shutting down in GX_VAR minutes."

#GX_CLOSING_ACTION=shutdown
#GX_CLOSING_UPDATE=true
#GX_CLOSING_UPDATE_DELAY=5m

#these values are used to keep track of which closing time the actions were done for,
# so if the closing time switches mid-day (like a last minute closing change) we can re-do warnings/shutdowns again
DIDLOGOUT=-9999
DIDLASTWARN=-9999
DIDWARN=-9999

#get rid of extra m just in case someone put it there
GX_CLOSING_LOGOFF_MINUTES=$(echo $GX_CLOSING_LOGOFF_MINUTES | sed 's/m//')
GX_CLOSING_LAST_WARNING_MINUTES=$(echo $GX_CLOSING_LAST_WARNING_MINUTES | sed 's/m//')
GX_CLOSING_WARNING_MINUTES=$(echo $GX_CLOSING_WARNING_MINUTES | sed 's/m//')

CURDATE=$(date +%Y-%m-%d)
mkdir -p /var/lib/groovix/times-per-day/$CURDATE

#loop forever, checking time once per minute
while true; do

if [ -e /var/run/groovix/closing-timer-cancel ] ; then
	echo groovix-closing-timer has been cancelled until reboot
	exit 0
fi

# in case we want to REMOVE entries for a specific date, etc.
unset GX_CLOSING_TIME

#must declare as associative array
declare -A GX_CLOSING_TIME

#re-read this every minute: that way we can change values mid-day and still shutdown at the right time
. /usr/share/groovix/global.conf


NOWYEAR=$(date +'%Y')
NOWMONTH=$(date +'%m')
NOWDAY=$(date +'%d')
NOWYMD=${NOWYEAR}${NOWMONTH}$NOWDAY
NOWDOW=$(date +'%a')
#need to force base 10 or 09 is interpreted as octal and generates a value too great for base error
NOWHOUR=$((10#$(date +'%H' | sed 's/^0//' )))
NOWMIN=$((10#$(date +'%M' | sed 's/^0//' )))
NOWDAYMIN=$((NOWHOUR*60+NOWMIN))
echo "############################################################################################"
echo "current time : $NOWYMD $NOWDOW $NOWHOUR $NOWMIN"

for K in "${!GX_CLOSING_TIME[@]}"; do echo GX_CLOSING_TIME\[$K\]=${GX_CLOSING_TIME[$K]}; done

#echo debug NOWDOW=$NOWDOW GX_CLOSING_TIME\[$NOWDOW\]=${GX_CLOSING_TIME[$NOWDOW]}

if [ -n "${GX_CLOSING_TIME[$NOWYMD]}" ] ; then
        CLOSINGTIME=${GX_CLOSING_TIME[$NOWYMD]}
elif [ -n "${GX_CLOSING_TIME[$NOWDOW]}" ] ; then
        CLOSINGTIME=${GX_CLOSING_TIME[$NOWDOW]}
elif [ -n "${GX_CLOSING_TIME[default]}" ] ; then
        CLOSINGTIME=${GX_CLOSING_TIME[default]}
fi


if [ -z "$CLOSINGTIME" ] ; then
        echo "no closing time specified, exiting"
        exit 0
fi


#need to force base 10 or 09 is interpreted as octal and generates a value too great for base error
CLOSEMIN=$((10#${CLOSINGTIME#*:}))
CLOSEHOUR=$((10#${CLOSINGTIME%:*}))

CLOSEDAYMIN=$((CLOSEHOUR*60+CLOSEMIN))
echo "closing time today is $CLOSEHOUR : $CLOSEMIN"
echo CLOSEDAYMIN is \"$CLOSEDAYMIN\"
	


echo NOWDAYMIN is \"$NOWDAYMIN\"
LOGOUTDAYMIN=$((CLOSEDAYMIN-GX_CLOSING_LOGOFF_MINUTES))
echo LOGOUTDAYMIN is \"$LOGOUTDAYMIN\" 
WARNDAYMIN=$((CLOSEDAYMIN-GX_CLOSING_LOGOFF_MINUTES-GX_CLOSING_WARNING_MINUTES))
echo WARNDAYMIN is \"$WARNDAYMIN\"
LASTWARNDAYMIN=$((CLOSEDAYMIN-GX_CLOSING_LOGOFF_MINUTES-GX_CLOSING_LAST_WARNING_MINUTES))
echo LASTWARNDAYMIN is \"$LASTWARNDAYMIN\"

TIMETOCLOSE=$((LOGOUTDAYMIN-NOWDAYMIN))
GX_CLOSING_WARNING_MESSAGE=$(echo $GX_CLOSING_WARNING_MESSAGE | sed "s/GX_VAR/$TIMETOCLOSE/" )
GX_CLOSING_LAST_WARNING_MESSAGE=$(echo $GX_CLOSING_LAST_WARNING_MESSAGE | sed "s/GX_VAR/$TIMETOCLOSE/" )


DONESTAMP=/var/lib/groovix/times-per-day/$CURDATE/closing-timer-done-$LOGOUTDAYMIN
# also check if DONESTAMP is from after 6 am - while doing re-installs during late evening into morning you still want to shut down that following evening
# ideally the hardcoded 6 am would be a variable
if [ -e "$DONESTAMP" ] && [ "$GX_CLOSING_RUNONCE" = "true" ] && [ $(stat -c %y $DONESTAMP  |cut -c 12-13) -ge 6 ] ; then
	echo "the closing timer has already been activated for this time ( $CURDATE $LOGOUTDAYMIN )"
	echo "  and will not activate again because GX_CLOSING_RUNONCE is true and it was activated after 6 am "
	ls -l $DONESTAMP
else

if [ "$DIDLOGOUT" -ne "$LOGOUTDAYMIN" ] && [ "$NOWDAYMIN" -ge "$LOGOUTDAYMIN" ] ; then
	DIDLOGOUT=$LOGOUTDAYMIN
	DIDLASTWARN=$LASTWARNDAYMIN
	DIDWARN=$WARNDAYMIN
	GSPARGS=""
	if [ "$GX_CLOSING_ACTION" = "reboot" ] ; then
		GSPR="--reboot"
	elif [ "$GX_CLOSING_ACTION" = "shutdown" ] ; then
		GSPS="--shutdown"
	fi
	if [ -n "$GX_CLOSING_UPDATE" ] ; then
		GSPU="--update"
	fi
	if [ -n "$GX_CLOSING_UPDATE_DELAY" ] ; then
		GSPUD="--update-delay $GX_CLOSING_UPDATE_DELAY"
	fi

	# count this closing time as being "done"
	touch $DONESTAMP
	echo doing groovix-shutdown-procedure --from=closing $GSPR $GSPS $GSPU $GSPUD 
	           groovix-shutdown-procedure --from=closing $GSPR $GSPS $GSPU $GSPUD

elif [ "$DIDLASTWARN" -ne "$LASTWARNDAYMIN" ] && [ "$NOWDAYMIN" -ge "$LASTWARNDAYMIN" ] ; then
	DIDLASTWARN=$LASTWARNDAYMIN
	DIDWARN=$WARNDAYMIN
	echo doing groovix-alert --type "warning" --title "FINAL WARNING" --message "$GX_CLOSING_LAST_WARNING_MESSAGE" 
	           groovix-alert --type "warning" --title "FINAL WARNING" --message "$GX_CLOSING_LAST_WARNING_MESSAGE"
elif [ "$DIDWARN" -ne "$WARNDAYMIN" ] && [ "$NOWDAYMIN" -ge "$WARNDAYMIN" ] ; then
	DIDWARN=$WARNDAYMIN
	echo doing groovix-alert --type "warning" --title "WARNING" --message "$GX_CLOSING_WARNING_MESSAGE" 
	           groovix-alert --type "warning" --title "WARNING" --message "$GX_CLOSING_WARNING_MESSAGE"
fi

fi


sleep 59
echo

done
