#!/bin/bash

[ -r "/etc/backup.conf" ] && \
  . "/etc/backup.conf"

usage()
{
  >&2 echo \
'Usage:  forwarddown key-id date backup-id1 backup-id2 ...
Write encrypted, compressed tar from backed up files not newer than date to stdout.

Options:
  key-id        key id of key to encrypt to
  date          backup should not be newer than the given date
  backup-id[n]  backups to restore
  --help                 display this help and exit
  --version              display version and exit'
  [ -z "$1" ] && exit 1
  exit $1
}

if [ $# -eq 1 ]; then
  if [ "$1" == "--help" ]; then
    usage 0
  elif [ "$1" == "--version" ]; then
    echo '2.2.3'
    exit
  fi
fi

if [ $# -lt 3 ]; then
  usage
fi

key_id=$(
  printf '%s\n' "$1" \
  | tr '[:lower:]' '[:upper:]'
)
shift

if ! gpg --list-keys --with-colon "${key_id}" \
| grep -qxF 'fpr:::::::::'"${key_id}"':'; then
  >&2 printf 'Cannot find gpg key with fingerprint "%s"\n' "${key_id}"
  usage
fi

if ! date=$(date -u '+%Y_%m_%d' -d"${1}"); then
  >&2 printf 'Cannot parse date "%s"\n' "${1}"
  usage
fi
shift

forwarddown_dirs=()

for backup_id in "$@"; do
  if [ -z "${backups[${backup_id}]}" ]; then
    >&2 printf 'backup id "%s" is unknown\n' "${backup_id}"
    usage
  fi
  forwarddown_dirs+=("${backups[${backup_id}]## *}")
done

date=$(
  {
    find "${forwarddown_dirs[@]%% *}" -mindepth 1 -maxdepth 1 -type d -printf '0 %f\n'
    printf '1 %s\n' "${date}"
  } \
  | sort -k2,2 -k1,1 \
  | sed '
    s/^0 //
    t
    /^1 / q
  ' \
  | uniq -c \
  | sed '
    s/^\s*'"${#forwarddown_dirs[@]}"'\s\+//
    t
    d
  ' \
  | tail -n1
)

transforms=(
  $(
    for backup_id in "$@"; do
      printf -- '--transform=s@^%s/%s/@%s/%s/@\n' \
        "${backups[${backup_id}]%% *}" \
        "${date}" \
        "${date}" \
        "${backup_id}"
    done
  )
)

directories=(
  $(
    for backup_id in "$@"; do
      printf '%s/%s/\n' \
        "${backups[${backup_id}]%% *}" \
        "${date}"
    done
  )
)

tar \
  -c \
  -f - \
  --absolute-names \
  "${transforms[@]}" \
  "${directories[@]}" \
| pigz --best -c - \
| gpg -e -r "${key_id}" -o - -
