#!/bin/bash
set -euo pipefail
shopt -s nullglob globstar

if [[ $# -eq 0 ]] ; then
    echo 'No snapper config supplied'
    exit 0
fi

readonly SNAPPER_CONFIG=$1

if [ ! -f /etc/snapper/configs/$SNAPPER_CONFIG ]; then
    echo 'No snapper config with this name'
    exit 0
fi

 notify_err() {
     notify-send -u critical "Backup $SNAPPER_CONFIG failed!"
 }
trap 'notify_err' ERR

NETWORK_TIMEOUT=120
i=0
while [ "$(nmcli -g connectivity general status)" = "none" ]; do
    i=$[$i+1]
    if [ $i -gt "$NETWORK_TIMEOUT" ]; then
        echo "Network not up, skipping upload" >&2
        exit 0
    fi
    sleep 1
done


source /etc/snapper/configs/$SNAPPER_CONFIG

readonly DATE_FORMAT="+%Y%m%d-%H%M%S"
export GNUPGHOME="/home/fox/.config/gnupg"
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

BORG_PASSPHRASE="$(cat ~/.cache/borg/key)"
export BORG_PASSPHRASE
BORG_RSH="ssh -i /home/fox/.ssh/machine"
export BORG_RSH

LAST_SNAPSHOT="$(snapper --json -c home list | jq -j '(.[] | reverse)[0]')"
LATEST_SNAPSHOT_ID="$(echo $LAST_SNAPSHOT | jq -r '.number' )"
LATEST_DATE=$(echo $LAST_SNAPSHOT | jq -j '.date' | xargs -0 date "+%s" -d)
BORG_LIST=0

if ! borg info borg@linderud.dev:backup/$(hostname)/$SNAPPER_CONFIG &> /dev/null; then
    borg init --umask 0027 --encryption=repokey-blake2 borg@linderud.dev:backup/$(hostname)/$SNAPPER_CONFIG || true
fi
if ! BORG_LIST=$(borg list --json borg@linderud.dev:backup/$(hostname)/$SNAPPER_CONFIG | jq -j '(.archives | reverse)[0] | .time' | xargs -0 date "+%s" -d) &> /dev/null; then
    BORG_LIST=0
fi

test $LATEST_DATE -lt ${BORG_LIST//-} && exit 0

# notify-send "Started $SNAPPER_CONFIG backup"
sudo backup-sudo mount "${SUBVOLUME%/}/.snapshots/$LATEST_SNAPSHOT_ID" "${SUBVOLUME%/}/.snapshots/backup"
cleanup() {
    sudo backup-sudo cleanup "${SUBVOLUME%/}/.snapshots/backup"
}
trap cleanup EXIT
mkdir -p ~/.config/borg || true
touch ~/.config/borg/exclude
if ! borg create --stats --umask 0027 -v -p -C zstd \
    --pattern="!/.snapshots/*/snapshot/proc" \
    --pattern="!/.snapshots/*/snapshot/sys" \
    --pattern="!/.snapshots/*/snapshot/dev" \
    --pattern="!/.snapshots/*/snapshot/run" \
    --pattern="!/.snapshots/*/snapshot/tmp" \
    --pattern="!/.snapshots/*/snapshot/var/cache" \
    --pattern="!/.snapshots/*/snapshot/var/lib/archbuild" \
    --pattern="!/.snapshots/*/snapshot/var/lib/build" \
    --pattern="!/.snapshots/*/snapshot/tmp" \
    --pattern="!/.snapshots/backup/snapshot/.snapshots" \
    --pattern="!/.snapshots/backup/info.xml" \
    --patterns-from ~/.config/borg/exclude \
borg@linderud.dev:backup/$(hostname)/$SNAPPER_CONFIG::$(date $DATE_FORMAT) "${SUBVOLUME%/}/.snapshots/backup"; then
    notify-send -u critical "Backup $SNAPPER_CONFIG failed"
fi
# notify-send "$SNAPPER_CONFIG backup done"
borg prune --umask 0027 -v borg@linderud.dev:backup/$(hostname)/$SNAPPER_CONFIG \
       --keep-hourly 24 \
       --keep-daily   7 \
       --keep-weekly  4 \
       --keep-monthly 6
