#!/usr/bin/env bash
# Activate the repo-pinned pnpm with bounded retries.
# Replaces pnpm/action-setup self-installer, which flakes with
# "Cannot find module '../lib/cli.js'" on busy self-hosted runners.
set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"

read_pinned_pnpm_version() {
  local raw
  raw="$(node -e "const pm=require('./package.json').packageManager||''; const m=pm.match(/^pnpm@(.+)$/); if(!m) process.exit(1); process.stdout.write(m[1]);")"
  if [[ -z "${raw//[[:space:]]/}" ]]; then
    echo 'setup-pnpm-action: packageManager must be pnpm@<version>' >&2
    return 1
  fi
  printf '%s' "$raw"
}

VERSION="${PNPM_VERSION:-$(read_pinned_pnpm_version)}"
PNPM_HOME="${PNPM_HOME:-${RUNNER_TEMP:-${TMPDIR:-/tmp}}/setup-pnpm}"
SOURCED=0
if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
  SOURCED=1
fi

for attempt in 1 2 3; do
  rm -rf "$PNPM_HOME"
  mkdir -p "$PNPM_HOME"
  if npm install --no-fund --no-audit --prefix "$PNPM_HOME" "pnpm@${VERSION}"; then
    export PNPM_HOME="$PNPM_HOME/node_modules/.bin"
    export PATH="$PNPM_HOME:$PATH"
    if [[ -n "${GITHUB_PATH:-}" ]]; then
      echo "$PNPM_HOME" >>"$GITHUB_PATH"
    fi
    if pnpm --version; then
      if (( SOURCED )); then
        return 0
      fi
      exit 0
    fi
  fi
  echo "setup-pnpm-action: attempt ${attempt} failed; retrying..." >&2
  sleep $((attempt * 2))
done

echo 'setup-pnpm-action: pnpm activation failed after 3 attempts' >&2
if (( SOURCED )); then
  return 1
fi
exit 1
