#!/usr/bin/env bash
# vim:et:ts=2:sts=2:sw=2

# Get absolute repository root (especially when symlinked)
ROOT="$(realpath "$(dirname "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")")")"

# Load accompanying bash library
source "$ROOT/lib/lib.bash"

SUBJECT="$1"     # Name of curriculum subject to download
REMOTE="$2"      # Http or Rsync remote
VERSION_ARG="$3" # Optional version

if [[ -z "$SUBJECT" || -z "$REMOTE" || "${1:-}" =~ ^(-h|--help)$ || -n "$HELP" ]]; then
  say "
  USAGE:
    $(g "${BASH_SOURCE##*/}")  $(c subject)  $(c remote)  [$(c version)]

  DESCRIPTION:
    Downloads a curriculum subject from a remote.
    If version is omitted, the latest remote version is used.

  EXAMPLES:
    $(g "${BASH_SOURCE##*/}")  $(c docs)    $(c http://bastion.techlitafrica.org)
    $(g "${BASH_SOURCE##*/}")  $(c raster)  $(c server.local) $(c 1.0.0)
  "
  exit 1
fi

# Exit now if run as root user
assert-is-user

DIR="/srv/curriculum/$SUBJECT"
mkdir -p "$DIR/.v"

if [[ "$REMOTE" =~ ^https?:// ]]; then
  CLIENT="${DOWNLOAD_CLIENT:-aria2}"
else
  CLIENT="${DOWNLOAD_CLIENT:-rsync}"
fi
REMOTE_NAME="${REMOTE#*://}"

say "Syncing local and remote versions for subject '$(c "$SUBJECT")'"

V_LOCAL="$("$ROOT"/bin/tl-comp-latest curriculum "$SUBJECT")"
V_REMOTE="$("$ROOT"/bin/tl-comp-latest curriculum "$SUBJECT" "$REMOTE")"
V_TARGET="${VERSION_ARG:-$V_REMOTE}"

if [[ -z "$V_TARGET" ]]; then
  err "No target version found for subject $(c "$SUBJECT"). Specify a version or sync remote."
  exit 1
fi

say "Local: $(c "$V_LOCAL") | Remote: $(c "$V_REMOTE") | Target: $(c "$V_TARGET")"

download() {
  local ver="v$1" dir="$2"
  local base="$REMOTE/curriculum/$SUBJECT/$ver"

  if [[ "$CLIENT" == "aria2" ]]; then
    run aria2c --continue --allow-overwrite -d "$dir" -P -Z "$base.tar.gz" "$base.sha256"
  else
    run rsync --cc=xxh3 -avzP --partial --append-verify \
      "$REMOTE_NAME:/srv/curriculum/$SUBJECT/$ver".* "$dir"
  fi
  return # propagate exit code from run
}

if download "$V_TARGET" "$DIR"; then
  echo "$V_TARGET" >"$DIR/.v/local"
  say "Subject $(c "$SUBJECT") version $(c "$V_TARGET") downloaded."
  say "Up-to-date."
else
  err "Failed to pull subject $(c "$SUBJECT") version $(c "$V_TARGET")"
  exit 1
fi

exit 0
