#!/bin/sh
. ~/.bash_profile
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'

set -x


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

borg create \
	$VERBOSE_FLAGS                    \
	--comment "$COMMENT"              \
	--exclude ~/.cache                \
	--stats                           \
	--compression lzma,9              \
	"::{hostname}-{now}-$ARCHIVE_TAG" \
	~/ ||:

borg check \
	--verbose

borg prune \
	--verbose         \
	--list            \
	--keep-within=6m  \
	--keep-weekly=52  \
	--keep-monthly=24
