#!/bin/sh
set -eu

usage() {
	cat <<-'EOF'
		Usage:
		  backup [-v] [-C COMMENT] ARCHIVE_TAG
		  backup -h
	EOF
}

help() {
	cat <<-'EOF'


		Options:
		  -v            enable verbose mode, useful for
		                interactive sessions
		  -C COMMENT    the comment text to be attached to the archive
		  -h, --help    show this message

		  ARCHIVE_TAG   the tag used to create the new
		                backup (default: "cronjob")


		The repository is expected to have been created with:

		  $ borg init -e repokey-blake2

		The following environment variables are expected to be exported:

		  $BORG_PASSCOMMAND
		  $BORG_REPO
		  $BORG_REMOTE_PATH

		Password-less SSH access is required, usually done via adding
		~/.ssh/id_rsa.pub to suyin:.ssh/authorized_keys.


		Examples:

		  Run backup from cronjob:

		    $ backup cronjob

		  Create backup with comment, and verbose mode active:

		    $ backup -vC 'The backup has a comment' my-backup
	EOF
}

for flag in "$@"; do
	case "$flag" in
		--)
			break
			;;
		--help)
			usage
			help
			exit
			;;
		*)
			;;
	esac
done

VERBOSE_FLAGS=''
COMMENT=''
while getopts 'vC:h' flag; do
	case "$flag" in
		v)
			VERBOSE_FLAGS='--verbose --progress'
			;;
		C)
			COMMENT="$OPTARG"
			;;
		h)
			usage
			help
			exit
			;;
		*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))

assert_arg() {
	if [ -z "$1" ]; then
		printf 'Missing %s\n' "$2" >&2
		usage >&2
		exit 2
	fi
}

ARCHIVE_TAG="${1:-}"
assert_arg "$ARCHIVE_TAG" 'ARCHIVE_TAG'


finish() {
	STATUS=$?
	printf '\n>>>\n>>> exit status: %s\n>>>\n\n' "$STATUS" >&2
}
trap finish EXIT

run() {
	borg create \
		$VERBOSE_FLAGS                    \
		--comment "$COMMENT"              \
		--exclude ~/.cache/               \
		--exclude ~/Downloads/            \
		--stats                           \
		--compression lzma,9              \
		"::{hostname}-{now}-$ARCHIVE_TAG" \
		~/
	STATUS=$?

	if [ "$STATUS" = 0 ] || [ "$STATUS" = 1 ]; then
		echo 'WARNING, but no ERROR.' >&2
		return 0
	else
		return "$STATUS"
	fi
}

run || exit $?
