#!/bin/bash
#                       /usr/local/bin/today
# https://crystalfaeries.net/posix/bin/today
# celeste:crystalfaery TODAY 2020-06-08 23:46:41+00:00
# Process "expiry" and "reveals" of blog articles (see expire).
# Create today's blog entry file if it does not exist,
# or, with a date argument, file for the specified date.
# With -a (auto) option: expire, reveal or auto-generate today's article.
# The blog entry or prepublish file is templated from:
# "${HOME}"/crystalfaeries.net/src/.today.header.txt
# "${HOME}"/crystalfaeries.net/src/.today.readme.txt
# If not AUTO then edit and preview the selected file.
#NOTE: we default to 32 days of visibility from publish date.

let help=14	# 1 less than this line's # in file

false		# default action is interactive edit session
let AUTO=$?	# if -a then run in AUTO mode without editing

cd	"${HOME}"/crystalfaeries.net/src/	2>> "${HOME}"/.chronicle.log 1>&2	# chronicle HTML source

case $# in

0)	# with no options or arguments we just interactively edit today's blog entry
	if [ -s			"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt ]
	then
		echo "...editing today's blog entry file" 1>&2
	else
    		if [ -s		"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date).fae.txt ]
    		then
			echo "...revealing today's blog entry file" 1>&2
			rsync -auvH	"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date).fae.txt	\
					"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt
			delete		"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date).fae.txt
			touch		"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt
			touch		.
    		else
			echo "...creating today's blog entry file" 1>&2
			echo -n "Date:	"									\
					>  "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
			now		>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
			echo "Expiry:	$((`date +%s -d "$(now -f | sed 's/\..*$//')"` + 60*60*24*32))"		\
					>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
			cat		   "${HOME}"/crystalfaeries.net/src/.today.header.txt			\
					>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
			now -n						    $(date --rfc-3339=date).fae.txt	\
					>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
			events		>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
			cat		   "${HOME}"/crystalfaeries.net/src/.today.readme.txt			\
					>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
    		fi
	fi
	vi		"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt	\
	&& preview	"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt
	exit	$?	# return preview completion code else process'
	;;

*)	# we have option(s) and/or argument(s) on the command line
    case "${1}" in
    -h | --help )
	head -n $help $0	# output the help info
	exit			# and quit
	;;
    -v | --version )
	head -n 4 $0 | tail -n 1	# dated = version
	exit			# and quit
	;;
    -a | --auto )
	true		# AUTO generate/reveal today's blog entry if missing
	let AUTO=$?	# but DO NOT EDIT INTERACTIVELY (called by blog script)
	shift		# consume the argument (but we expect no more)
	;;		# if we have AUTO there should be no date but today!
    * )			# we should have a date (e.g. 2020-06-08) as "${1}".
			# OR ELSE we are in AUTO mode (-a).
	if [ "${1}" == "" ]
	then
		exec	$0	"$( date +%s -d "$(now -f | sed 's/\..*$//')" )"	# RECURSIVE
	else
	fi
	echo	'EXPIRE BEGIN' 2>> "${HOME}"/.chronicle.log 1>&2
	# EXPIRE Articles containing "Expiry:" entry
	for f in $(grep '^Expiry:	' *.txt | sed 's/:.*$//')
	do
		if [ $(date +%s) -gt $(grep '^Expiry:	' ${f} | cut -f2-) ]
		then	# this article is beyond its expiry timestamp
			echo "Expired:	${f}"	>>	"${HOME}"/.chronicle.log 2>&1
			delete	 `pwd`/"${f}"	>>	"${HOME}"/.chronicle.log 2>&1
		else	# this article is within its limited lifespan
			echo "Visible:	${f}"	>>	"${HOME}"/.chronicle.log 2>&1
		fi
	done

	# UNLESS THE USER ERRED in article creation, Expiry SHOULD post-date Publish date, RIGHT?
	# So above we only expired already published articles, not Future Publish articles we may now reveal.
	# This creates a minimum publish count of once for any article before it expires, per run of this script.
	if [ -s		"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date).fae.txt ]
	then
		echo "...revealing today's blog entry file" 1>&2
		rsync -auvH	"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date).fae.txt	\
				"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt
		delete		"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date).fae.txt
		touch		"${HOME}"/crystalfaeries.net/src/$(date  --rfc-3339=date).fae.txt	\
		&& touch	.					2>> "${HOME}"/.chronicle.log 1>&2	# source was updated
	else
		echo "...creating today's blog entry file" 1>&2
		echo -n "Date:	"									\
				>  "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		now		>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		echo "Expiry:	$((`date +%s -d "$(now -f | sed 's/\..*$//')"` + 60*60*24*32))"		\
				>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		cat		   "${HOME}"/crystalfaeries.net/src/.today.header.txt			\
				>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		now -n						    $(date --rfc-3339=date).fae.txt	\
				>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		events		>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		cat		   "${HOME}"/crystalfaeries.net/src/.today.readme.txt			\
				>> "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date).fae.txt
		touch	.						2>> "${HOME}"/.chronicle.log 1>&2	# source was updated
	fi

	echo	'PREVIEW' 2>> "${HOME}"/.chronicle.log 1>&2
	# NOTE: User may PREVIEW hidden files with /usr/local/bin/preview into "${HOME}"/crystalfaeries.net/fay/
	# User may generate "tomorrow's" blog entry as a hidden file
	# which is not published by chronicle until first run on publish date or our manual invocation.
	for f in .20*.fae.txt
	do	# YES, ***	CODE BREAKS FOR DATES PAST 2099-12-31	*** my bad :-)
	  	hidden="$(echo ${f}		| sed 's/\.fae\.txt$//')"
		revealed="$(echo ${hidden}	| sed 's/^\.//')"
    	if	[ "${revealed}" -lt "$(now	| sed 's/\ .*$//')" ]
    	then    # next UNrevealed future file displayed
	    	echo "${hidden}.fae.txt"				2>> "${HOME}"/.chronicle.log >> /tmp/today.preview.$$
    	else	# do NOT overwrite the REVEALED file with a later-dated zero-size (deleted) UNrevealed file
		rsync -auvH	$hidden.fae.txt $revealed.fae.txt	2>> "${HOME}"/.chronicle.log 1>&2	\
		&& delete	$hidden.fae.txt				2>> "${HOME}"/.chronicle.log 1>&2	\
		&& touch			$revealed.fae.txt	2>> "${HOME}"/.chronicle.log 1>&2	\
		&& touch	.					2>> "${HOME}"/.chronicle.log 1>&2	# source was updated
    	fi
    	if [ -s /tmp/today.preview.$$ ]
	    then
		    preview $(sort	/tmp/today.preview.$$)	# PREVIEW ALL UNREVEALED ARTICLES (what's your habit on how many?)
	    fi
	done

	# if we have an argument left from command-line, it should be date of file to edit
	if [	-w			   "${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date -d "${1}").fae.txt ]
	then	# file already published
    		if [ \! $AUTO ]
    		then
			echo "...editing existing blog entry file for ${1}" 1>&2
			vi		"${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date -d "${1}").fae.txt		\
			&& preview	"${HOME}"/crystalfaeries.net/src/$(date --rfc-3339=date -d "${1}").fae.txt
			exit $?
    		fi
	fi
	if [	-w			   "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt ]
	then	# prepublish file already exists
    		if [ \! $AUTO ]
    		then
			echo "...editing existing blog PrePublish file for ${1}" 1>&2
			vi		"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt		\
			&& preview	"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
			exit $?
		fi
	else	# file does not already exist
    		if [ \! $AUTO ]
    		then
			echo "...creating	  blog PrePublish file for ${1}" 1>&2
			echo -n "Date:	"	>  "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt	\
						|| exit $? # bad date: ${1}
			date -u --rfc-3339=seconds -d "${1}"	| sed 's/00:00:00/10:00:00/'					\
 						>> "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
			echo "Expiry:	$((`date +%s -d "${1}"` + 60*60*24*32))"						\
						>> "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
				cat		   "${HOME}"/crystalfaeries.net/src/.today.header.txt				\
						>> "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
				now  -n "${1}"	>> "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
				events  "${1}"	>> "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
				cat		   "${HOME}"/crystalfaeries.net/src/.today.readme.txt				\
						>> "${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
	fi
	if [ \! $AUTO ]
	then
		vi		"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt		\
		&& preview	"${HOME}"/crystalfaeries.net/src/.$(date --rfc-3339=date -d "${1}").fae.txt
		exit $?
	fi

	;;
    esac

    ;;
esac

exit	$?	#  Pau for Now
