#!/usr/bin/env bash
# Generated release copies pin the CLI digest below. No sudo or global npm packages.
set -euo pipefail
WBA_VERSION='0.1.8'
WBA_SHA256='baa84ddfa51d7dcd3626839611e0152648645d7e899e909cc7cf465675c54ad8'
WBA_NODE_VERSION='22.22.3'
WBA_PREFIX="${WBA_INSTALL_PREFIX:-$HOME/.local}"
WBA_BASE_URL='https://whatbuyersask.com'
WBA_ORIGIN='https://app.whatbuyersask.com'
WBA_SOURCE_DIR=''
WBA_LOGIN=0
WBA_CHECK_WEBSITE=''
WBA_MODIFY_PATH=1
WBA_BROWSER=1
while [ "$#" -gt 0 ]; do
  case "$1" in
    --prefix|--base-url|--origin|--source-dir|--check)
      [ "$#" -ge 2 ] || { echo "Missing value for $1" >&2; exit 1; }
      case "$1" in
        --prefix) WBA_PREFIX="$2";; --base-url) WBA_BASE_URL="${2%/}";;
        --origin) WBA_ORIGIN="$2";; --source-dir) WBA_SOURCE_DIR="$2";; --check) WBA_CHECK_WEBSITE="$2";;
      esac; shift 2;;
    --login) WBA_LOGIN=1; shift;;
    --skip-login) WBA_LOGIN=0; shift;;
    --no-modify-path) WBA_MODIFY_PATH=0; shift;;
    --no-browser) WBA_BROWSER=0; shift;;
    --help) cat <<'HELP'
WhatBuyersAsk installer (macOS / Linux, x64 / ARM64)
  --prefix PATH       Install under PATH (default: ~/.local)
  --check WEBSITE     Install and test AI bot access without logging in
  --login             Connect your workspace after installing (optional)
  --skip-login        Install only (the default); keep an existing login
  --no-browser        With --login, print the URL instead of opening it
  --no-modify-path    Do not add the bin directory to your shell configuration
  --origin URL        Portal origin (default: https://app.whatbuyersask.com)
  --base-url URL      HTTPS release host (default: https://whatbuyersask.com)
  --source-dir PATH   Install a locally built release (offline development)
HELP
      exit 0;;
    *) echo "Unknown option: $1" >&2; exit 1;;
  esac
done
[ -z "$WBA_CHECK_WEBSITE" ] || [ "$WBA_LOGIN" -eq 0 ] || { echo 'Use --check for a public website test. Run wba login separately for workspace access.' >&2; exit 1; }
case "$WBA_PREFIX" in /*) ;; *) echo '--prefix must be an absolute path.' >&2; exit 1;; esac
case "$WBA_BASE_URL" in https://*) ;; *) echo '--base-url must use HTTPS.' >&2; exit 1;; esac
case "$WBA_PREFIX" in *$'\n'*|*$'\r'*) echo 'Invalid install path.' >&2; exit 1;; esac
[ "${#WBA_SHA256}" -eq 64 ] || { echo 'Build the release with node apps/cli/build-release.mjs first.' >&2; exit 1; }
case "$(uname -s)" in Darwin) WBA_OS=darwin;; Linux) WBA_OS=linux;; *) echo 'Supported systems: macOS and Linux (including WSL).' >&2; exit 1;; esac
case "$(uname -m)" in arm64|aarch64) WBA_ARCH=arm64;; x86_64|amd64) WBA_ARCH=x64;; *) echo 'Supported architectures: x64 and ARM64.' >&2; exit 1;; esac
command -v curl >/dev/null || { echo 'Install curl using your system package manager, then retry.' >&2; exit 1; }
if command -v sha256sum >/dev/null; then
  wba_digest() { sha256sum "$1" | awk '{print $1}'; }
elif command -v shasum >/dev/null; then
  wba_digest() { shasum -a 256 "$1" | awk '{print $1}'; }
else echo 'A SHA-256 tool (sha256sum or shasum) is required.' >&2; exit 1; fi
wba_fetch() { curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' --connect-timeout 15 --max-time 300 "$1" -o "$2"; }
umask 077
mkdir -p "$WBA_PREFIX/lib/whatbuyersask" "$WBA_PREFIX/bin"
WBA_TMP="$(mktemp -d "$WBA_PREFIX/lib/whatbuyersask/.install.XXXXXX")"
trap 'rm -rf "$WBA_TMP"' EXIT
WBA_ARTIFACT="cli/v$WBA_VERSION/wba.mjs"
if [ -n "$WBA_SOURCE_DIR" ]; then
  cp "$WBA_SOURCE_DIR/$WBA_ARTIFACT" "$WBA_TMP/wba.mjs"
else
  echo "Downloading WhatBuyersAsk CLI ${WBA_VERSION}..."
  wba_fetch "$WBA_BASE_URL/$WBA_ARTIFACT" "$WBA_TMP/wba.mjs"
fi
[ "$(wba_digest "$WBA_TMP/wba.mjs")" = "$WBA_SHA256" ] || { echo 'CLI checksum mismatch. Nothing was installed.' >&2; exit 1; }
WBA_NODE=''
if command -v node >/dev/null && node -e 'process.exit(Number(process.versions.node.split(".")[0]) >= 22 ? 0 : 1)' 2>/dev/null; then
  WBA_NODE="$(command -v node)"
else
  WBA_RUNTIME="$WBA_PREFIX/lib/whatbuyersask/node-v$WBA_NODE_VERSION-$WBA_OS-$WBA_ARCH"
  if [ -x "$WBA_RUNTIME/bin/node" ] && "$WBA_RUNTIME/bin/node" -e "process.exit(process.versions.node === '$WBA_NODE_VERSION' ? 0 : 1)" 2>/dev/null; then
    WBA_NODE="$WBA_RUNTIME/bin/node"
  else
    case "$WBA_OS-$WBA_ARCH" in
      darwin-arm64) WBA_NODE_SHA=0da7ff74ef8611328c8212f17943368713a2ad953fb7d89a8c8a0eae87c23207;;
      darwin-x64) WBA_NODE_SHA=45830ba752fa0d892c6dcd640946669801293cac820a33591ded40ac075198ec;;
      linux-arm64) WBA_NODE_SHA=cc8bc82b2dd0b595c3b95a4c3c9c8c350907cff011afbdee3d1379e812e1e3e3;;
      linux-x64) WBA_NODE_SHA=c7a10d6816da8eaaa7534dd73c71c6e2b2c391dbbf845e364902d156615dd1b8;;
    esac
    echo "Installing a private Node.js $WBA_NODE_VERSION runtime…"
    wba_fetch "https://nodejs.org/dist/v$WBA_NODE_VERSION/node-v$WBA_NODE_VERSION-$WBA_OS-$WBA_ARCH.tar.gz" "$WBA_TMP/node.tar.gz"
    [ "$(wba_digest "$WBA_TMP/node.tar.gz")" = "$WBA_NODE_SHA" ] || { echo 'Node.js checksum mismatch.' >&2; exit 1; }
    tar -xzf "$WBA_TMP/node.tar.gz" -C "$WBA_TMP"
    "$WBA_TMP/node-v$WBA_NODE_VERSION-$WBA_OS-$WBA_ARCH/bin/node" --version >/dev/null || { echo 'This runtime is not compatible with your OS. Install Node.js 22 or newer, then retry.' >&2; exit 1; }
    [ ! -e "$WBA_RUNTIME" ] || { echo 'Existing private runtime is invalid. Inspect it before reinstalling.' >&2; exit 1; }
    mv "$WBA_TMP/node-v$WBA_NODE_VERSION-$WBA_OS-$WBA_ARCH" "$WBA_RUNTIME"
    WBA_NODE="$WBA_RUNTIME/bin/node"
  fi
fi
WBA_TARGET="$WBA_PREFIX/lib/whatbuyersask/wba-$WBA_VERSION-$WBA_SHA256.mjs"
"$WBA_NODE" --check "$WBA_TMP/wba.mjs"
chmod 600 "$WBA_TMP/wba.mjs"
mv -f "$WBA_TMP/wba.mjs" "$WBA_TARGET"
# Bash's %q protects paths containing spaces, quotes, dollars or backticks.
{
  printf '#!/usr/bin/env bash\nexec '
  printf '%q ' "$WBA_NODE" "$WBA_TARGET"
  printf '"$@"\n'
} > "$WBA_TMP/wba"
chmod 755 "$WBA_TMP/wba"
"$WBA_NODE" --input-type=module - "$WBA_TARGET" "$WBA_TMP/wba" "$WBA_VERSION" "$WBA_SHA256" <<'JS'
import { readFileSync, writeFileSync } from 'node:fs';
import { createHash } from 'node:crypto';
import { basename } from 'node:path';
const [entry, launcher, version, sha256] = process.argv.slice(2);
writeFileSync(entry + '.install.json', JSON.stringify({version, sha256, entry: basename(entry), launcherSha256: createHash('sha256').update(readFileSync(launcher)).digest('hex')}) + '\n', {mode:0o600});
JS
mv -f "$WBA_TMP/wba" "$WBA_PREFIX/bin/wba"
[ "$("$WBA_PREFIX/bin/wba" --version)" = "$WBA_VERSION" ] || { echo 'Installed CLI failed its startup check.' >&2; exit 1; }
if [ "$WBA_MODIFY_PATH" -eq 1 ]; then
  case "${SHELL:-}" in
    */zsh) WBA_RC="$HOME/.zshrc";;
    */bash) WBA_RC="$HOME/.bashrc";;
    *) WBA_RC='';;
  esac
  if [ -n "$WBA_RC" ]; then
    WBA_PATH_LINE="$(printf 'export PATH=%q:"$PATH" # WhatBuyersAsk CLI' "$WBA_PREFIX/bin")"
    if ! grep -Fqx "$WBA_PATH_LINE" "$WBA_RC" 2>/dev/null; then printf '\n%s\n' "$WBA_PATH_LINE" >> "$WBA_RC"; fi
  fi
fi
echo "Installed: $WBA_PREFIX/bin/wba"
echo "For this terminal, run: $(printf 'export PATH=%q:"$PATH"' "$WBA_PREFIX/bin")"
if [ -n "$WBA_CHECK_WEBSITE" ]; then
  "$WBA_PREFIX/bin/wba" access check "$WBA_CHECK_WEBSITE"
elif [ "$WBA_LOGIN" -eq 1 ]; then
  if [ "$WBA_BROWSER" -eq 1 ]; then "$WBA_PREFIX/bin/wba" login --origin "$WBA_ORIGIN"
  else "$WBA_PREFIX/bin/wba" login --origin "$WBA_ORIGIN" --no-browser; fi
else
  echo 'Ready. Test your website:'
  echo '  wba https://example.com'
  echo 'Website checks do not need a login or research credits.'
  echo 'For workspace research, sign in when you need it: wba login'
fi
