# cron output backend
# shellcheck shell=bash

eval_cron_expr() {
	local m h dom mon dow
	case "${timer[OnCalendar]}" in
		# handle special calendar event expressions
		minutely) ;;
		hourly) m=0 ;;
		daily)
			m=0
			h=0
			;;
		weekly)
			m=0
			h=0
			dow=1
			;;
		monthly)
			m=0
			h=0 dom=1
			;;
		quarterly)
			m=0
			h=0
			dom=1
			m=1,4,7,10
			;;
		semiannually)
			m=0
			h=0
			dom=1
			m=1,7
			;;
		yearly)
			m=0
			h=0
			dom=1
			m=1
			;;
		# Parse
		*)
			read -ra oncal <<<"${timer[OnCalendar]}"
			for calsub in "${oncal[@]}"; do
				# echo "Sub: ${calsub}"
				if [[ "$calsub" =~ ^([,0-6]|\.\.|Sun|Mon|Tue|Wed|Thu|Fri|Sat)+$ ]]; then
					declare -l dow="${calsub//../-}"
					continue
					echo " dow: ${dow}"
				fi
				case "${calsub}" in
					*-*) # Date
						# cron is year agnostic, just require mon-dom and
						dom="${calsub##*-}"
						calsub="${calsub%-"$dom"}"
						mon="${calsub##*-}"
						continue
						echo " mon: $mon"
						echo " dom: $dom"
						;;
					*:*) # Time
						# cron granularity is seconds
						h="${calsub%%:*}"
						calsub="${calsub#"${h}":}"
						m="${calsub%%:*}"
						continue
						echo " h: $h"
						echo " m: $m"
						;;
				esac
			done
			;;
	esac
	echo "${m:-*} ${h:-*} ${dom:-*} ${mon:-*} ${dow:-*}"
}

gen_cron_entry() {
	local sep
	crontab=$(eval_cron_expr)
	printf '# %s\n\n' 'm h dom mon dow user command'
	printf '%s %s [ -d /run/systemd/system ] || {' "${crontab}" "${service[User]:-root}"
	while read -r cmd; do
		printf '%s %s' "${sep:-}" "${cmd}"
		sep=';'
	done <<<"$(handle_exec_prefixes "${service[ExecStart]}")"
	printf '; }\n'
	printf '# %s\n' 'Alternatively, if your system is running openrc you could use'
	printf '# %s %s %s\n' "${crontab}" 'root' "rc-service ${systemd_unit_file%.timer} start"
}


export_timer() {
	systemd_unit=$1
	base_dir=$2
	cron_dir="${base_dir}/cron.d"

	if [[ -z "${timer[OnCalendar]:-}" ]] ; then
		# Empty, are any of OnActiveSec, OnBootSec, OnStartupSec,
		# OnUnitActiveSec, OnUnitInactiveSec, OnClockChange,
		# OnTimezoneChange supportable?
	    	echo "WARNING: timer[OnCalendar] empty, skipping" >&2
		return
	fi

	mkdir -p "${cron_dir}"

	cron_d_file="${cron_dir}/$(basename "${systemd_unit}" .timer)"
	# embed source and sha256
	gen_origin >"${cron_d_file}"

	# generate the cron entry into the appropriate file
	gen_cron_entry >>"${cron_d_file}"
}
