name: Catalog Previews

permissions:
  contents: read

# Suppress hyperframes CLI telemetry from HeyGen's own CI runs.
# External users' CI continues to emit telemetry unless they set this themselves.
env:
  HYPERFRAMES_NO_TELEMETRY: "1"

on:
  pull_request:
    branches: [main]
    paths:
      - "registry/blocks/**"
      - "registry/components/**"
      - "scripts/generate-catalog-previews.ts"
      - ".github/workflows/catalog-previews.yml"

concurrency:
  group: catalog-previews-${{ github.ref }}
  cancel-in-progress: true

jobs:
  preflight:
    name: Preflight (lint + format)
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
      - uses: ./.github/actions/preflight

  render-previews:
    name: Render catalog previews
    needs: preflight
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
        with:
          fetch-depth: 0

      - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2

      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
        with:
          node-version: 22

      - run: bun install --frozen-lockfile

      - run: bun run build

      # Chrome headless shell for rendering
      - uses: browser-actions/setup-chrome@c785b87e244131f27c9f19c1a33e2ead956ab7ce # v1
        with:
          chrome-version: stable

      - name: Render changed block/component previews
        env:
          BASE_SHA: ${{ github.event.pull_request.base.sha }}
        run: |
          # Find which blocks/components changed in this PR
          CHANGED_ITEMS=$(git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- registry/blocks/ registry/components/ \
            | grep -E '^registry/(blocks|components)/' \
            | sed 's|^registry/[^/]*/\([^/]*\)/.*|\1|' \
            | sort -u)

          if [ -z "$CHANGED_ITEMS" ]; then
            echo "No block/component changes detected."
            exit 0
          fi

          echo "Changed items: $CHANGED_ITEMS"
          FAILED=0

          for item in $CHANGED_ITEMS; do
            echo "Rendering preview for: $item"
            if ! timeout 120 npx tsx scripts/generate-catalog-previews.ts --only "$item" --skip-video; then
              echo "::warning::Failed to render preview for $item"
              FAILED=$((FAILED + 1))
            fi
          done

          if [ "$FAILED" -gt 0 ]; then
            echo "::warning::$FAILED item(s) failed to render"
            exit 1
          fi

      - name: Upload preview artifacts
        if: always()
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
        with:
          name: catalog-previews
          path: docs/images/catalog/
          if-no-files-found: ignore
          retention-days: 7
