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

fail() { printf 'error: %s\n' "$*" >&2; exit 1; }

persist_path() {
  local rc rcs
  case "${SHELL##*/}" in
    zsh) rcs=("${ZDOTDIR:-$HOME}/.zshrc") ;;
    bash) for rc in "$HOME/.bash_profile" "$HOME/.bash_login" "$HOME/.profile"; do [[ -e "$rc" ]] && break; done; rcs=("$HOME/.bashrc" "$rc") ;;
    *) printf 'Add %s to your PATH to run circuit.\n' "$1" && return ;;
  esac
  for rc in "${rcs[@]}"; do
    grep -Fqs "# Circuit CLI binary" "$rc" && continue
    printf '\n# Circuit CLI binary\nexport PATH=%q:"$PATH"\n' "$1" >> "$rc"
  done
  printf 'Added %s to PATH in %s. In this terminal, run: export PATH="%s:$PATH"\n' "$1" "${rcs[*]}" "$1"
}

main() {
  local bin_dir="$HOME/.local/bin" platform="" manifest version version_re='"version":"([^"]+)"'
  case "$(uname -s)-$(uname -m)" in
    Darwin-*) [[ "$(sysctl -in hw.optional.arm64)" != 1 ]] || platform=darwin-arm64 ;;
    Linux-x86_64) platform=linux-x64 ;;
    Linux-aarch64) platform=linux-arm64 ;;
  esac
  [[ -n "$platform" && "$(ldd --version 2>&1 || true)" != *musl* ]] || fail "Circuit CLI supports Apple Silicon macOS and glibc Linux (x64 or ARM64)."
  manifest="$(curl -fsSL https://api.circuit.org/dev/cli/manifest.json)"
  [[ $manifest =~ $version_re ]] || fail "The CLI release has no version."
  version="${BASH_REMATCH[1]}"
  work="$(mkdir -p "$bin_dir" && mktemp -d "$bin_dir/.install-XXXXXX")"; trap 'rm -rf "$work"' EXIT
  curl -fsSL "https://api.circuit.org/dev/cli/$version/circuit-$platform.gz" | gunzip > "$work/circuit"
  chmod 755 "$work/circuit"
  case "$(command -v circuit || true)" in "" | "$bin_dir/circuit") ;; *) printf 'Remove the older circuit at %s (bun remove -g @circuitorg/agent-cli).\n' "$(command -v circuit)" ;; esac
  mv "$work/circuit" "$bin_dir/circuit"
  [[ ":$PATH:" == *":$bin_dir:"* ]] || persist_path "$bin_dir"
  "$bin_dir/circuit" --version
  [[ -z "${1:-}" ]] || printf 'Next, run: %s auth login && %s pull %s\n' "$bin_dir/circuit" "$bin_dir/circuit" "$1"
}

main "$@"
