#!/usr/bin/env sh
set -e

GCS_BASE="https://storage.googleapis.com/gridspace-guava-cli/cli"
BINARY="guava"
INSTALL_DIR="${GUAVA_INSTALL_DIR:-$HOME/.local/bin}"

# ---------------------------------------------------------------------------
# Parse flags first — fail fast before any downloads or filesystem writes.
# Note: when invoked via `curl | sh`, $@ is empty because flags after `sh` are
# consumed by the shell itself. Use `curl ... | sh -s -- --sample-project` or
# `curl ... | GUAVA_SAMPLE_PROJECT=1 sh` instead.
# ---------------------------------------------------------------------------
SAMPLE_PROJECT="${GUAVA_SAMPLE_PROJECT:-0}"
for arg in "$@"; do
  case "$arg" in
    --sample-project) SAMPLE_PROJECT=1 ;;
    *)
      echo "Unknown option: $arg" >&2
      exit 1
      ;;
  esac
done

# ---------------------------------------------------------------------------
# Detect OS and architecture
# ---------------------------------------------------------------------------
OS="$(uname -s)"
ARCH="$(uname -m)"

case "$OS" in
  Linux)  OS="linux" ;;
  Darwin) OS="darwin" ;;
  *)
    echo "Unsupported OS: $OS"
    exit 1
    ;;
esac

case "$ARCH" in
  x86_64 | amd64) ARCH="x86_64" ;;
  arm64 | aarch64) ARCH="aarch64" ;;
  *)
    echo "Unsupported architecture: $ARCH"
    exit 1
    ;;
esac

# ---------------------------------------------------------------------------
# Resolve version (pin with GUAVA_VERSION=x.y.z to install a specific version)
# ---------------------------------------------------------------------------
if [ -z "$GUAVA_VERSION" ]; then
  GUAVA_VERSION="$(curl -fsSL "${GCS_BASE}/latest")"
fi

if [ -z "$GUAVA_VERSION" ]; then
  echo "Could not determine latest version. Set GUAVA_VERSION manually and re-run."
  exit 1
fi

URL="${GCS_BASE}/${GUAVA_VERSION}/${BINARY}-${OS}-${ARCH}"

# ---------------------------------------------------------------------------
# Download and install
# ---------------------------------------------------------------------------
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT

mkdir -p "$INSTALL_DIR"

echo "Installing guava ${GUAVA_VERSION} (${OS}/${ARCH})..."
curl -fsSL "$URL" -o "$TMP"
chmod +x "$TMP"
mv "$TMP" "${INSTALL_DIR}/${BINARY}"


echo "Installed to ${INSTALL_DIR}/${BINARY}"

# ---------------------------------------------------------------------------
# Ensure INSTALL_DIR is on PATH (append to shell rc if missing).
# A script invoked via `curl|sh` cannot mutate the parent shell's PATH, so
# this only takes effect in future shells.
# ---------------------------------------------------------------------------
ACTIVATE_CMD=""
case ":$PATH:" in
  *":${INSTALL_DIR}:"*) ;;   # already on PATH — nothing to do
  *)
    SHELL_NAME="$(basename "${SHELL:-}")"
    ACTIVATE_CMD="export PATH=\"${INSTALL_DIR}:\$PATH\""
    case "$SHELL_NAME" in
      zsh)  RC_FILE="${ZDOTDIR:-$HOME}/.zshrc" ;;
      bash) RC_FILE="$HOME/.bashrc" ;;
      fish) RC_FILE="$HOME/.config/fish/config.fish"
            ACTIVATE_CMD="fish_add_path \"${INSTALL_DIR}\"" ;;
      *)    RC_FILE="$HOME/.profile" ;;
    esac
    mkdir -p "$(dirname "$RC_FILE")"
    touch "$RC_FILE"
    if ! grep -Fqs "$ACTIVATE_CMD" "$RC_FILE"; then
      printf '\n# Added by guava installer\n%s\n' "$ACTIVATE_CMD" >> "$RC_FILE"
      echo "Added '${INSTALL_DIR}' to PATH in ${RC_FILE} (applies to new terminals)."
    fi
    ;;
esac
# ---------------------------------------------------------------------------
# Next steps — colored prompt (disabled when not a TTY or NO_COLOR is set)
# ---------------------------------------------------------------------------
if [ -t 1 ] && [ -z "${NO_COLOR:-}" ] && [ -n "${TERM:-}" ] && [ "${TERM:-}" != "dumb" ]; then
  GREEN='\033[0;32m'
  BOLD='\033[1m'
  DIM='\033[2m'
  RESET='\033[0m'
else
  GREEN=''
  BOLD=''
  DIM=''
  RESET=''
fi

printf '\n%b%bNext steps:%b\n' "$BOLD" "$GREEN" "$RESET"
if [ -n "$ACTIVATE_CMD" ]; then
  printf '  %b1.%b This terminal does not know about guava yet.\n' "$BOLD$GREEN" "$RESET"
  printf '     Restart your terminal, or copy and paste this line to use it right now:\n\n'
  printf '         %b%s%b\n\n' "$BOLD$GREEN" "$ACTIVATE_CMD" "$RESET"
  printf '     %b(You only need to do this once.)%b\n' "$DIM" "$RESET"
  printf '\n'
  printf '  %b2.%b Then run %bguava login%b to get started.\n\n' "$BOLD$GREEN" "$RESET" "$BOLD$GREEN" "$RESET"
else
  printf '  %b•%b Run %bguava login%b to get started.\n\n' "$BOLD$GREEN" "$RESET" "$BOLD$GREEN" "$RESET"
fi

# ---------------------------------------------------------------------------
# Optionally scaffold a sample project
# ---------------------------------------------------------------------------
if [ "$SAMPLE_PROJECT" = "1" ]; then
  "${INSTALL_DIR}/${BINARY}" sample-project
fi
