#!/bin/sh
# Backup client installer. Re-running it replaces the local client after a checksum check.
set -eu
ORIGIN='https://backup.alix-services.com'
TOKEN="${1:-}"
if [ -n "$TOKEN" ]; then
  case "$TOKEN" in
    bsa_*) ;;
    *)
      echo "That argument does not look like a pairing token. Tokens start with bsa_." >&2
      exit 1
      ;;
  esac
fi
if [ -z "${HOME:-}" ]; then
  echo "HOME is not set, so there is nowhere to save the client." >&2
  exit 1
fi
NEW_HOME="$HOME/.backup"
OLD_HOME="$HOME/.backupsolved"
if [ -e "$NEW_HOME" ] || [ -L "$NEW_HOME" ]; then
  AGENT_HOME="$NEW_HOME"
elif [ -e "$OLD_HOME" ] || [ -L "$OLD_HOME" ]; then
  if ln -s "$OLD_HOME" "$NEW_HOME" 2>/dev/null; then
    AGENT_HOME="$NEW_HOME"
  else
    AGENT_HOME="$OLD_HOME"
  fi
else
  AGENT_HOME="$NEW_HOME"
fi
DEST_DIR="$AGENT_HOME/bin"
DEST="$DEST_DIR/bs-agent.js"
TMP="$(mktemp)"
cleanup() { rm -f "$TMP"; }
trap cleanup EXIT
mkdir -p "$DEST_DIR"
chmod 700 "$DEST_DIR" 2>/dev/null || true
echo "Downloading the Backup client..."
curl -fsSL "$ORIGIN/install/bs-agent.js" -o "$TMP"
EXPECTED="$(curl -fsSL "$ORIGIN/install/bs-agent.js.sha256" | awk 'NR==1 { print $1 }')"
if command -v sha256sum >/dev/null 2>&1; then
  ACTUAL="$(sha256sum "$TMP" | awk '{ print $1 }')"
elif command -v shasum >/dev/null 2>&1; then
  ACTUAL="$(shasum -a 256 "$TMP" | awk '{ print $1 }')"
else
  echo "sha256sum or shasum is required to check the client." >&2
  exit 1
fi
if [ "$ACTUAL" != "$EXPECTED" ]; then
  echo "Checksum did not match." >&2
  echo "Expected $EXPECTED" >&2
  echo "Got      $ACTUAL" >&2
  exit 1
fi
mv "$TMP" "$DEST"
trap - EXIT
chmod 700 "$DEST" 2>/dev/null || true
echo "Saved $DEST"
echo "SHA-256 $ACTUAL"
if command -v node >/dev/null 2>&1 && node -e 'process.exit(Number(process.versions.node.split(".")[0]) >= 18 ? 0 : 1)'; then
  if [ -n "$TOKEN" ]; then
    node "$DEST" pair --server "$ORIGIN" --token "$TOKEN"
  else
    node "$DEST" pair --server "$ORIGIN"
  fi
  echo "Daily backup is the default."
else
  echo "Node.js 18 or newer is required before this computer can connect."
fi
echo "To remove the client later, run: node $DEST uninstall"
