#!/bin/sh
# ARIA CLI installer
# Usage: curl -fsSL https://raw.githubusercontent.com/aria-cli/aria-releases/main/scripts/install.sh | sh
#
# Installs the ARIA standalone binary to ~/.local/bin/aria
# No Node.js, npm, or bun required.
#
# Environment variables:
#   ARIA_INSTALL_DIR  — override install directory (default: ~/.local/bin)
#   ARIA_VERSION      — pin to a specific version (default: latest)
#   ARIA_NO_CHECKSUM  — skip SHA256 verification (default: verify)
#   GITHUB_TOKEN      — authenticate for private repo downloads

set -e

REPO="aria-cli/aria-releases"
INSTALL_DIR="${ARIA_INSTALL_DIR:-$HOME/.local/bin}"
BINARY_NAME="aria"

# ---- Detect platform --------------------------------------------------------

OS="$(uname -s)"
ARCH="$(uname -m)"

case "$OS" in
  Darwin)  PLATFORM="darwin" ;;
  Linux)   PLATFORM="linux" ;;
  *)       echo "Error: Unsupported OS: $OS" >&2; exit 1 ;;
esac

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

# Linux x64 uses the baseline target (glibc, broad compatibility)
if [ "$PLATFORM" = "linux" ] && [ "$ARCH" = "x64" ]; then
  TARGET="${PLATFORM}-${ARCH}-baseline"
else
  TARGET="${PLATFORM}-${ARCH}"
fi

ARTIFACT="aria-${TARGET}"

# ---- Fetch helpers -----------------------------------------------------------

if command -v curl >/dev/null 2>&1; then
  fetch() { curl -fsSL "$@"; }
  fetch_to() { curl -fsSL -o "$2" "$1"; }
elif command -v wget >/dev/null 2>&1; then
  fetch() { wget -qO- "$@"; }
  fetch_to() { wget -q -O "$2" "$1"; }
else
  echo "Error: curl or wget required" >&2; exit 1
fi

# ---- Resolve version ---------------------------------------------------------

if [ -n "${ARIA_VERSION:-}" ]; then
  LATEST="$ARIA_VERSION"
else
  LATEST=$(fetch "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed 's/.*"v\(.*\)".*/\1/' 2>/dev/null || echo "")
  if [ -z "$LATEST" ]; then
    LATEST=$(npm view @aria-cli/cli version 2>/dev/null || echo "1.0.41")
  fi
fi

echo "Installing ARIA ($TARGET)"
echo ""
echo "  Version: $LATEST"
echo "  Target:  $TARGET"
echo "  Install: $INSTALL_DIR/$BINARY_NAME"
echo ""

# ---- Download binary ---------------------------------------------------------

DOWNLOAD_URL="https://github.com/$REPO/releases/download/v${LATEST}/${ARTIFACT}"
CHECKSUM_URL="${DOWNLOAD_URL}.sha256"

mkdir -p "$INSTALL_DIR"

echo "  Downloading..."
DOWNLOAD_OK=false

# Method 1: gh CLI (works for private repos)
if command -v gh >/dev/null 2>&1; then
  gh release download "v${LATEST}" --repo "$REPO" --pattern "${ARTIFACT}" --dir "$INSTALL_DIR" --clobber 2>/dev/null \
    && DOWNLOAD_OK=true
  if [ "$DOWNLOAD_OK" = true ] && [ -z "${ARIA_NO_CHECKSUM:-}" ]; then
    gh release download "v${LATEST}" --repo "$REPO" --pattern "${ARTIFACT}.sha256" --dir "$INSTALL_DIR" --clobber 2>/dev/null || true
  fi
fi

# Method 2: curl/wget with GITHUB_TOKEN
if [ "$DOWNLOAD_OK" = false ] && [ -n "${GITHUB_TOKEN:-}" ]; then
  if command -v curl >/dev/null 2>&1; then
    curl -fsSL -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/octet-stream" \
      "$DOWNLOAD_URL" -o "$INSTALL_DIR/$ARTIFACT" 2>/dev/null && DOWNLOAD_OK=true
    if [ "$DOWNLOAD_OK" = true ] && [ -z "${ARIA_NO_CHECKSUM:-}" ]; then
      curl -fsSL -H "Authorization: token $GITHUB_TOKEN" \
        "$CHECKSUM_URL" -o "$INSTALL_DIR/${ARTIFACT}.sha256" 2>/dev/null || true
    fi
  fi
fi

# Method 3: Direct download (public repos)
if [ "$DOWNLOAD_OK" = false ]; then
  fetch_to "$DOWNLOAD_URL" "$INSTALL_DIR/$ARTIFACT" 2>/dev/null && DOWNLOAD_OK=true
  if [ "$DOWNLOAD_OK" = true ] && [ -z "${ARIA_NO_CHECKSUM:-}" ]; then
    fetch_to "$CHECKSUM_URL" "$INSTALL_DIR/${ARTIFACT}.sha256" 2>/dev/null || true
  fi
fi

# ---- Fallback to npm --------------------------------------------------------

if [ "$DOWNLOAD_OK" = false ] || [ ! -f "$INSTALL_DIR/$ARTIFACT" ] || [ ! -s "$INSTALL_DIR/$ARTIFACT" ]; then
  rm -f "$INSTALL_DIR/$ARTIFACT" "$INSTALL_DIR/${ARTIFACT}.sha256" 2>/dev/null
  echo ""
  echo "  Binary not available yet for $TARGET."
  echo "  Falling back to npm install..."
  echo ""

  if command -v bun >/dev/null 2>&1; then
    bun install -g @aria-cli/cli@"$LATEST"
  elif command -v npm >/dev/null 2>&1; then
    npm install -g @aria-cli/cli@"$LATEST"
  else
    echo "Error: No package manager found. Install bun or npm first." >&2
    exit 1
  fi
  echo ""
  echo "  ARIA installed via npm"
  echo "  Run: aria --version"
  exit 0
fi

# ---- Verify checksum ---------------------------------------------------------

if [ -z "${ARIA_NO_CHECKSUM:-}" ] && [ -f "$INSTALL_DIR/${ARTIFACT}.sha256" ]; then
  echo "  Verifying checksum..."
  EXPECTED=$(cut -d' ' -f1 "$INSTALL_DIR/${ARTIFACT}.sha256")
  if command -v sha256sum >/dev/null 2>&1; then
    ACTUAL=$(sha256sum "$INSTALL_DIR/$ARTIFACT" | cut -d' ' -f1)
  elif command -v shasum >/dev/null 2>&1; then
    ACTUAL=$(shasum -a 256 "$INSTALL_DIR/$ARTIFACT" | cut -d' ' -f1)
  else
    echo "  Warning: sha256sum/shasum not found, skipping verification"
    ACTUAL="$EXPECTED"
  fi
  if [ "$EXPECTED" != "$ACTUAL" ]; then
    echo "Error: Checksum mismatch!" >&2
    echo "  Expected: $EXPECTED" >&2
    echo "  Actual:   $ACTUAL" >&2
    rm -f "$INSTALL_DIR/$ARTIFACT" "$INSTALL_DIR/${ARTIFACT}.sha256"
    exit 1
  fi
  echo "  Checksum OK ($EXPECTED)"
  rm -f "$INSTALL_DIR/${ARTIFACT}.sha256"
fi

# ---- Install -----------------------------------------------------------------

mv "$INSTALL_DIR/$ARTIFACT" "$INSTALL_DIR/$BINARY_NAME"
chmod +x "$INSTALL_DIR/$BINARY_NAME"

# ---- Download sqlite-vec sidecar (optional) ----------------------------------

if [ "$PLATFORM" = "darwin" ]; then
  VEC_EXT="vec0.dylib"
else
  VEC_EXT="vec0.so"
fi

VEC_URL="https://github.com/$REPO/releases/download/v${LATEST}/${VEC_EXT}"
VEC_DEST="$INSTALL_DIR/$VEC_EXT"

# Best-effort download: sqlite-vec enables vector search but is not required
if command -v gh >/dev/null 2>&1; then
  gh release download "v${LATEST}" --repo "$REPO" --pattern "$VEC_EXT" --dir "$INSTALL_DIR" --clobber 2>/dev/null || true
elif [ -n "${GITHUB_TOKEN:-}" ]; then
  curl -fsSL -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/octet-stream" \
    "$VEC_URL" -o "$VEC_DEST" 2>/dev/null || true
else
  fetch_to "$VEC_URL" "$VEC_DEST" 2>/dev/null || true
fi

if [ -f "$VEC_DEST" ] && [ -s "$VEC_DEST" ]; then
  echo "  sqlite-vec sidecar installed: $VEC_DEST"
else
  rm -f "$VEC_DEST" 2>/dev/null
fi

# ---- Done --------------------------------------------------------------------

VERSION=$("$INSTALL_DIR/$BINARY_NAME" --version 2>/dev/null || echo "unknown")

echo ""
echo "  ARIA $VERSION installed to $INSTALL_DIR/$BINARY_NAME"
echo ""

# Check if install dir is in PATH
case ":$PATH:" in
  *":$INSTALL_DIR:"*) ;;
  *)
    echo "  Add $INSTALL_DIR to your PATH:"
    echo ""
    echo '    export PATH="'"$INSTALL_DIR"':$PATH"'
    echo ""
    SHELL_NAME="$(basename "$SHELL" 2>/dev/null || echo "bash")"
    case "$SHELL_NAME" in
      zsh)  RC="$HOME/.zshrc" ;;
      bash) RC="$HOME/.bashrc" ;;
      fish) RC="$HOME/.config/fish/config.fish" ;;
      *)    RC="$HOME/.profile" ;;
    esac
    echo "  Or add it permanently:"
    echo ""
    echo "    echo 'export PATH=\"$INSTALL_DIR:\$PATH\"' >> $RC"
    echo ""
    ;;
esac

echo "  Run: aria --version"
