name: Setup pnpm + store cache
description: Prepare pnpm via corepack and restore pnpm store cache.
inputs:
  pnpm-version:
    description: pnpm version to activate via corepack.
    required: false
    default: "10.23.0"
  cache-key-suffix:
    description: Suffix appended to the cache key.
    required: false
    default: "node24"
  use-sticky-disk:
    description: Use Blacksmith sticky disks instead of actions/cache for pnpm store on trusted runs; pull_request runs fall back to actions/cache.
    required: false
    default: "false"
  use-restore-keys:
    description: Whether to use restore-keys fallback for actions/cache.
    required: false
    default: "true"
  use-actions-cache:
    description: Whether to restore/save pnpm store with actions/cache, including pull_request fallback when sticky disks are disabled.
    required: false
    default: "true"
runs:
  using: composite
  steps:
    - name: Setup pnpm (corepack retry)
      shell: bash
      env:
        PNPM_VERSION: ${{ inputs.pnpm-version }}
      run: |
        set -euo pipefail
        if [[ ! "$PNPM_VERSION" =~ ^[0-9]+(\.[0-9]+){1,2}([.-][0-9A-Za-z.-]+)?$ ]]; then
          echo "::error::Invalid pnpm-version input: '$PNPM_VERSION'"
          exit 2
        fi
        corepack enable
        for attempt in 1 2 3; do
          if corepack prepare "pnpm@$PNPM_VERSION" --activate; then
            pnpm -v
            exit 0
          fi
          echo "corepack prepare failed (attempt $attempt/3). Retrying..."
          sleep $((attempt * 10))
        done
        exit 1

    - name: Resolve pnpm store path
      id: pnpm-store
      shell: bash
      run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"

    - name: Mount pnpm store sticky disk
      # Keep persistent sticky-disk state off untrusted PR runs.
      if: inputs.use-sticky-disk == 'true' && github.event_name != 'pull_request'
      uses: useblacksmith/stickydisk@v1
      with:
        key: ${{ github.repository }}-pnpm-store-${{ runner.os }}-${{ github.ref_name }}-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }}
        path: ${{ steps.pnpm-store.outputs.path }}

    - name: Restore pnpm store cache (exact key only)
      # PRs that request sticky disks still need a safe cache restore path.
      if: inputs.use-actions-cache == 'true' && (inputs.use-sticky-disk != 'true' || github.event_name == 'pull_request') && inputs.use-restore-keys != 'true'
      uses: actions/cache@v5
      with:
        path: ${{ steps.pnpm-store.outputs.path }}
        key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }}

    - name: Restore pnpm store cache (with fallback keys)
      if: inputs.use-actions-cache == 'true' && (inputs.use-sticky-disk != 'true' || github.event_name == 'pull_request') && inputs.use-restore-keys == 'true'
      uses: actions/cache@v5
      with:
        path: ${{ steps.pnpm-store.outputs.path }}
        key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }}
        restore-keys: |
          ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-
