#!/bin/sh
# cruft installer — https://cruft.sh
#
#   curl -fsSL https://cruft.sh/install | sh
#
# Downloads the prebuilt cruft binary for your platform from cruftless.dev,
# verifies its sha256, and installs it to ~/.cruft/bin/cruft.
#
# Env overrides:
#   CRUFT_BASE     download base (default https://cruftless.dev/dl)
#   CRUFT_INSTALL  install dir   (default $HOME/.cruft)
set -eu

BASE="${CRUFT_BASE:-https://cruftless.dev/dl}"
INSTALL_DIR="${CRUFT_INSTALL:-$HOME/.cruft}"
BIN_DIR="$INSTALL_DIR/bin"

os="$(uname -s)"
arch="$(uname -m)"
case "$os" in
  Linux)  os=linux ;;
  Darwin) os=darwin ;;
  *) echo "cruft: unsupported OS '$os' — see https://cruftless.dev" >&2; exit 1 ;;
esac
case "$arch" in
  x86_64|amd64)  arch=x64 ;;
  arm64|aarch64) arch=arm64 ;;
  *) echo "cruft: unsupported architecture '$arch'" >&2; exit 1 ;;
esac

target="cruft-$os-$arch"
url="$BASE/$target"

dl() { # url out
  if command -v curl >/dev/null 2>&1; then curl -fSL "$1" -o "$2"
  elif command -v wget >/dev/null 2>&1; then wget -qO "$2" "$1"
  else echo "cruft: need curl or wget" >&2; exit 1
  fi
}

echo "cruft: installing $target -> $BIN_DIR/cruft"
mkdir -p "$BIN_DIR"
dl "$url" "$BIN_DIR/cruft"
chmod +x "$BIN_DIR/cruft"

# Verify sha256 when both the manifest and a hasher are available.
if command -v sha256sum >/dev/null 2>&1; then HASH="sha256sum"
elif command -v shasum >/dev/null 2>&1; then HASH="shasum -a 256"
else HASH=""; fi
if [ -n "$HASH" ] && dl "$url.sha256" "$BIN_DIR/cruft.sha256" 2>/dev/null; then
  expected="$(cut -d' ' -f1 "$BIN_DIR/cruft.sha256")"
  actual="$($HASH "$BIN_DIR/cruft" | cut -d' ' -f1)"
  rm -f "$BIN_DIR/cruft.sha256"
  if [ "$expected" != "$actual" ]; then
    echo "cruft: checksum mismatch (expected $expected, got $actual)" >&2
    rm -f "$BIN_DIR/cruft"; exit 1
  fi
  echo "cruft: sha256 verified"
fi

echo "cruft: installed."
case ":$PATH:" in
  *":$BIN_DIR:"*) ;;
  *) echo ""
     echo "Add cruft to your PATH:"
     echo "  export PATH=\"$BIN_DIR:\$PATH\"" ;;
esac
"$BIN_DIR/cruft" --version 2>/dev/null || true
