#!/usr/bin/env bash
set -euo pipefail

PRODUCT="spore"
OWNER="voidops"
REPO="spore"
INSTALL_DIR="${INSTALL_DIR:-/usr/local/bin}"
SPORE_VERSION="${SPORE_VERSION:-latest}"  # vX.Y.Z or "latest"
# Asset name pattern you publish in Releases. Change if you pick a different scheme.
# Example: spore-linux-amd64.tar.gz (+ .sha256 alongside)
ASSET_PREFIX="${ASSET_PREFIX:-spore}"

die(){ echo "error: $*" >&2; exit 1; }
have(){ command -v "$1" >/dev/null 2>&1; }
need(){ have "$1" || die "missing required tool: $1"; }

norm_os_arch() {
  local os arch
  case "$(uname -s)" in
    Linux)  os="linux" ;;
    Darwin) os="darwin" ;;
    *) die "unsupported OS: $(uname -s)";;
  esac
  case "$(uname -m)" in
    x86_64|amd64) arch="amd64" ;;
    arm64|aarch64) arch="arm64" ;;
    *) die "unsupported ARCH: $(uname -m)";;
  esac
  echo "$os" "$arch"
}

ensure_install_dir() {
  if [[ ! -d "$INSTALL_DIR" ]]; then
    if [[ -w "$(dirname "$INSTALL_DIR")" ]]; then
      mkdir -p "$INSTALL_DIR"
    else
      sudo mkdir -p "$INSTALL_DIR"
    fi
  fi
  if [[ -w "$INSTALL_DIR" ]]; then SUDO=""; else SUDO="sudo"; fi
}

verify_checksum() {
  local sums="$1" file="$2"
  if have shasum; then
    grep " $file\$" "$sums" | shasum -a 256 -c -
  elif have sha256sum; then
    grep " $file\$" "$sums" | sha256sum -c -
  else
    die "no sha256 tool (shasum or sha256sum) found"
  fi
}

install_binary() {
  need curl; need tar
  read -r OS ARCH < <(norm_os_arch)

  local base dl file sums verpath
  if [[ "$SPORE_VERSION" == "latest" ]]; then
    base="https://github.com/${OWNER}/${REPO}/releases/latest/download"
    verpath="latest"
  else
    base="https://github.com/${OWNER}/${REPO}/releases/download/${SPORE_VERSION}"
    verpath="${SPORE_VERSION}"
  fi

  file="${ASSET_PREFIX}-${OS}-${ARCH}.tar.gz"
  sums="${file}.sha256"

  tmp="$(mktemp -d)"; trap 'rm -rf "$tmp"' EXIT

  echo "-> Downloading ${file} (${verpath})"
  curl -fsSL "${base}/${file}" -o "${tmp}/${file}"
  curl -fsSL "${base}/${sums}" -o "${tmp}/${sums}"

  echo "-> Verifying checksum"
  verify_checksum "${tmp}/${sums}" "${file}"

  echo "-> Extracting"
  tar -xzf "${tmp}/${file}" -C "${tmp}"

  ensure_install_dir
  echo "-> Installing ${PRODUCT} to ${INSTALL_DIR}"
  ${SUDO} install -m 0755 "${tmp}/${PRODUCT}" "${INSTALL_DIR}/${PRODUCT}"

  echo "-> Installed: $("${INSTALL_DIR}"/${PRODUCT} --version 2>/dev/null || echo "${PRODUCT}")"
}

install_source() {
  need cargo
  echo "-> Building from source (Cargo.toml detected)"
  cargo build --release
  ensure_install_dir
  ${SUDO} install -m 0755 "target/release/${PRODUCT}" "${INSTALL_DIR}/${PRODUCT}"
  echo "-> Installed: $("${INSTALL_DIR}"/${PRODUCT} --version 2>/dev/null || echo "${PRODUCT}")" # This will r
}

main() {
  if [[ -f "./Cargo.toml" && -d "./src" ]]; then
    install_source
  else
    install_binary
  fi
}

main "$@"