#!/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" ] || [ -n "$HELP" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
  say "
  USAGE:
    $(g "${BASH_SOURCE##*/}")  $(c subject)  $(c remote)  [$(c version)]

  DESCRIPTION:
    $(g "${BASH_SOURCE##*/}") downloads $(c version) of
    curriculum subject $(c subject) from $(c remote)

    The lastest version on $(c remote) will be used by default

  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"

CLIENT="${DOWNLOAD_CLIENT:-$(echo "$REMOTE" | grep -Eq '^(http|https)://' && echo 'aria2' || echo 'rsync')}"
REMOTE_NAME="$(echo "$REMOTE" | awk -F '://' '{print $NF}')"

say "Syncing local and remote versions for subject '$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"). Make sure to specify a version or sync remote."
  exit 1
fi

say "Goal: $(c "$V_LOCAL") => $(c "$V_TARGET")"

# USAGE: download 0.8.20 /srv/curriculum/docs/
# Returns download exit code
download() {
  local ver=v"$1" dir="$2"

  local base_url="$REMOTE/curriculum/$SUBJECT/$ver"
  local urls=("$base_url.tar.gz" "$base_url.sha256")

  if [ "$CLIENT" = 'aria2' ]; then
    run aria2c --continue --allow-overwrite -d "$dir" -P -Z "${urls[@]}"
    return $?
  else
    run rsync --cc=xxh3 -avzP --partial --append-verify \
      "$REMOTE_NAME:/srv/curriculum/$SUBJECT/$ver".* "$dir"
    return $?
  fi
}

# The actual download part
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 curriculum subject $(c "$SUBJECT") version $(c "$V_TARGET")"
  exit 1
fi

exit 0
