#!/bin/sh
# Download the official Rogue CLI. No root privileges or shell-profile changes.
set -eu
base=https://rogue.camp
case "$(uname -s)/$(uname -m)" in
  Darwin/arm64) target=darwin-arm64 ;;
  Darwin/x86_64) target=darwin-x64 ;;
  Linux/x86_64) target=linux-x64 ;;
  Linux/aarch64|Linux/arm64) target=linux-arm64 ;;
  *) echo 'No prebuilt CLI for this system. See https://rogue.camp/api/v1/clients for SDKs and source.' >&2; exit 1 ;;
esac
for command in curl tar awk; do command -v "$command" >/dev/null 2>&1 || { echo "Install $command first." >&2; exit 1; }; done
if command -v sha256sum >/dev/null 2>&1; then hash=sha256sum
elif command -v shasum >/dev/null 2>&1; then hash=shasum
else echo 'Install sha256sum or shasum first.' >&2; exit 1; fi
install_dir=${ROGUE_INSTALL_DIR:-"$HOME/.local/bin"}
work=$(mktemp -d)
trap 'rm -rf "$work"' EXIT HUP INT TERM
if ! curl --proto '=https' --tlsv1.2 -fsS -D "$work/headers" "$base/api/v1/clients/cli/$target" -o "$work/rog.tar.gz"; then
  echo 'CLI download unavailable for this system. See https://rogue.camp/api/v1/clients.' >&2; exit 1
fi
expected=$(awk 'tolower($1)=="x-content-sha256:" {gsub("\r", "", $2); value=$2} END {print value}' "$work/headers")
member=$(awk 'tolower($1)=="x-rogue-cli-member:" {gsub("\r", "", $2); value=$2} END {print value}' "$work/headers")
case "$expected" in *[!a-f0-9]*|'') echo 'Invalid checksum metadata.' >&2; exit 1;; esac
[ ${#expected} -eq 64 ] || { echo 'Invalid checksum length.' >&2; exit 1; }
case "$member" in rog-*/bin/rog) ;; *) echo 'Invalid CLI package metadata.' >&2; exit 1;; esac
case "$member" in *..*|*[!a-zA-Z0-9./_-]*) echo 'Unsafe CLI package metadata.' >&2; exit 1;; esac
if [ "$hash" = sha256sum ]; then actual=$(sha256sum "$work/rog.tar.gz" | awk '{print $1}')
else actual=$(shasum -a 256 "$work/rog.tar.gz" | awk '{print $1}'); fi
[ "$actual" = "$expected" ] || { echo 'Checksum mismatch; nothing installed.' >&2; exit 1; }
# Stream just the named binary. Do not extract archive paths or execute package scripts.
tar -xOzf "$work/rog.tar.gz" "$member" > "$work/rog"
[ -s "$work/rog" ] || { echo 'CLI binary missing.' >&2; exit 1; }
chmod 755 "$work/rog"
"$work/rog" --help >/dev/null
mkdir -p "$install_dir"
# Rename atomically on the destination filesystem; preserve an existing binary on failure.
staged=$(mktemp "$install_dir/.rog-install.XXXXXX")
trap 'rm -rf "$work"; rm -f "${staged:-}"' EXIT HUP INT TERM
cat "$work/rog" > "$staged"
chmod 755 "$staged"
mv -f "$staged" "$install_dir/rog"
echo "Installed $install_dir/rog"
echo "Add $install_dir to PATH if needed. Run: rog --help"
