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

TERMLY_HOME="${TERMLY_HOME:-$HOME/.termly}"
TERMLY_CLI_PACKAGE="${TERMLY_CLI_PACKAGE:-@termly-dev/cli@1.9.5}"
TERMLY_PATCH_PACKAGE_URL="${TERMLY_PATCH_PACKAGE_URL:-https://www.termlyhos.com/termly-relay-patch-1.1.0.tgz}"
TERMLY_RELAY_URL="${TERMLY_RELAY_URL:-https://relay2.termlyhos.com}"
NODE_VERSION="${TERMLY_NODE_VERSION:-24.18.0}"
DRY_RUN="${TERMLY_INSTALL_DRY_RUN:-0}"

say() {
  printf '\n\033[1;34m%s\033[0m\n' "$1"
}

die() {
  printf '\n执简_Termly installer: %s\n' "$1" >&2
  exit 1
}

if [[ "$DRY_RUN" == "1" ]]; then
  cat <<EOF
执简_Termly installer dry run
home: $TERMLY_HOME
cli: $TERMLY_CLI_PACKAGE
patch: $TERMLY_PATCH_PACKAGE_URL
relay: $TERMLY_RELAY_URL
node fallback: v$NODE_VERSION (official nodejs.org archive + SHA-256 verification)
actions: ensure Node >=18, install CLI in user home, apply relay patch, update shell PATH
EOF
  exit 0
fi

command -v curl >/dev/null 2>&1 || die "curl is required."
command -v tar >/dev/null 2>&1 || die "tar is required."

node_is_compatible() {
  command -v node >/dev/null 2>&1 && node -e "process.exit(Number(process.versions.node.split('.')[0]) >= 18 ? 0 : 1)" >/dev/null 2>&1
}

sha256_file() {
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
  elif command -v sha256sum >/dev/null 2>&1; then
    sha256sum "$1" | awk '{print $1}'
  else
    die "shasum or sha256sum is required to verify Node.js."
  fi
}

install_node_runtime() {
  local os arch platform archive base_url tmp_dir expected actual extracted runtime_dir
  os="$(uname -s)"
  arch="$(uname -m)"

  case "$os" in
    Darwin) platform="darwin" ;;
    Linux) platform="linux" ;;
    *) die "Unsupported operating system: $os. Use install.ps1 on Windows." ;;
  esac

  case "$arch" in
    arm64|aarch64) arch="arm64" ;;
    x86_64|amd64) arch="x64" ;;
    *) die "Unsupported CPU architecture: $arch." ;;
  esac

  archive="node-v${NODE_VERSION}-${platform}-${arch}.tar.gz"
  base_url="https://nodejs.org/dist/v${NODE_VERSION}"
  runtime_dir="$TERMLY_HOME/runtimes/node-v${NODE_VERSION}-${platform}-${arch}"

  if [[ ! -x "$runtime_dir/bin/node" ]]; then
    say "Downloading verified Node.js v${NODE_VERSION}"
    tmp_dir="$(mktemp -d)"
    trap 'rm -rf "$tmp_dir"' RETURN
    curl -fsSLo "$tmp_dir/$archive" "$base_url/$archive"
    curl -fsSLo "$tmp_dir/SHASUMS256.txt" "$base_url/SHASUMS256.txt"
    expected="$(awk -v file="$archive" '$2 == file { print $1; exit }' "$tmp_dir/SHASUMS256.txt")"
    [[ -n "$expected" ]] || die "Node.js checksum entry was not found for $archive."
    actual="$(sha256_file "$tmp_dir/$archive")"
    [[ "$actual" == "$expected" ]] || die "Node.js SHA-256 verification failed."

    mkdir -p "$TERMLY_HOME/runtimes"
    tar -xzf "$tmp_dir/$archive" -C "$tmp_dir"
    extracted="$tmp_dir/node-v${NODE_VERSION}-${platform}-${arch}"
    [[ -x "$extracted/bin/node" ]] || die "Downloaded Node.js archive is incomplete."
    mv "$extracted" "$runtime_dir"
    rm -rf "$tmp_dir"
    trap - RETURN
  fi

  NODE_BIN_DIR="$runtime_dir/bin"
}

if node_is_compatible && command -v npm >/dev/null 2>&1 && command -v npx >/dev/null 2>&1; then
  NODE_BIN_DIR="$(dirname "$(command -v node)")"
  say "Using Node.js $(node --version)"
else
  install_node_runtime
fi

export PATH="$NODE_BIN_DIR:$TERMLY_HOME/bin:$PATH"
export npm_config_prefix="$TERMLY_HOME"

command -v node >/dev/null 2>&1 || die "Node.js is not available after installation."
command -v npm >/dev/null 2>&1 || die "npm is not available after installation."
command -v npx >/dev/null 2>&1 || die "npx is not available after installation."

say "Installing Termly CLI"
npm install --global --prefix "$TERMLY_HOME" "$TERMLY_CLI_PACKAGE"

say "Connecting Termly CLI to the 执简_Termly relay"
npx -y "$TERMLY_PATCH_PACKAGE_URL" "$TERMLY_RELAY_URL"

PROFILE_FILE="${TERMLY_SHELL_PROFILE:-}"
if [[ -z "$PROFILE_FILE" ]]; then
  case "${SHELL:-}" in
    */zsh) PROFILE_FILE="$HOME/.zshrc" ;;
    */bash) PROFILE_FILE="$HOME/.bashrc" ;;
    *) PROFILE_FILE="$HOME/.profile" ;;
  esac
fi

PATH_LINE="export PATH=\"$TERMLY_HOME/node/bin:$TERMLY_HOME/bin:\$PATH\""
mkdir -p "$(dirname "$PROFILE_FILE")"
touch "$PROFILE_FILE"
if ! grep -Fqx "$PATH_LINE" "$PROFILE_FILE"; then
  printf '\n# 执简_Termly desktop CLI\n%s\n' "$PATH_LINE" >> "$PROFILE_FILE"
fi

if [[ "$NODE_BIN_DIR" == "$TERMLY_HOME"/runtimes/*/bin ]]; then
  mkdir -p "$TERMLY_HOME"
  ln -sfn "${NODE_BIN_DIR%/bin}" "$TERMLY_HOME/node"
fi

say "执简_Termly desktop setup is ready"
cat <<EOF
Open a project and start one of your installed AI tools:

  cd /path/to/your/project
  termly start --ai claude-code

Other built-in Termly 1.9.5 targets: codex, opencode, gemini, qwen, aider, copilot
Open a new terminal, or run: source "$PROFILE_FILE"
EOF
