#!/bin/sh

backup_key="${HOME}/.ssh/borg/backup"
prune_key="${HOME}/.ssh/borg/prune"
backup_host="luca@server155.tralios.de"
# shellcheck disable=SC2088
repo="~/backup/dijkstra"
# shellcheck disable=SC2155
export BORG_PASSPHRASE="<#borg_passphrase#>"
export BORG_REPO="ssh://${backup_host}:22/${repo}"
export BORG_RSH="ssh -i ${backup_key}"

echo >"${XDG_DATA_HOME}/backup.log"
exec >>"${XDG_DATA_HOME}/backup.log" 2>&1

max() {
    printf "%s\n" "$@" | sort -nr | head -n1
}

info() {
    [ "$1" = "-e" ] && {
        shift
        notify-send -u critical Backupper "$*"
    }
    printf "\n%s %s\n\n" "$(date)" "$*"
}
trap 'echo $(date) Backup interrupted >&2; exit 2' INT TERM

info "Starting backup"

borg create \
    --verbose \
    --filter AME \
    --list \
    --stats \
    --show-rc \
    --compression lz4 \
    --exclude-caches \
    --upload-ratelimit 2000 \
    --exclude "${XDG_CACHE_HOME}/*" \
    --exclude "${XDG_STATE_HOME}/*" \
    --exclude "${XDG_CONFIG_HOME}/borg/*" \
    --exclude "${XDG_CONFIG_HOME}/chromium/*" \
    --exclude "${XDG_CONFIG_HOME}/Element/*" \
    --exclude "${XDG_DATA_HOME}/Trash/*" \
    --exclude "${XDG_DATA_HOME}/backup.log" \
    --exclude "${HOME}/.floorp" \
    --exclude "${HOME}/.mozilla/firefox/*" \
    --exclude "${HOME}/.thunderbird/*" \
    ::'{hostname}-{now}' \
    "${HOME}"

backup_exit=$?

info "Pruning repository"

# shellcheck disable=SC2029
echo "${BORG_PASSPHRASE}" | ssh \
    -o "IdentitiesOnly=yes" \
    -i "${prune_key}" \
    "${backup_host}" \
    false # This command is ignored but must be set

prune_exit=$?

info "Compacting repository"

borg compact

compact_exit=$?

global_exit=$(max $backup_exit $prune_exit $compact_exit)

case ${global_exit} in
    0) info "Backup, Prune, and Compact finished successfully" ;;
    1) info -e "Backup, Prune, and/or Compact finished with warnings" ;;
    *) info -e "Backup, Prune, and/or Compact finished with errors" ;;
esac

exit "${global_exit}"