# =============================================================================
# PR Check: Changeset — 检查 PR 是否附带 changeset
#
# 触发时机: PR 打开 / 有新推送 / 重开 / label 变更时自动运行
# 功能:
#   - 检查 PR 是否新增了 .changeset/*.md 文件
#   - 自动跳过: 纯文档/CI 变更(仅修改 .github/, docs/, *.md)
#   - 手动跳过: 添加 skip-changeset label
# =============================================================================

name: 'PR: Changeset Check'

on:
  pull_request:
    types: [opened, synchronize, reopened, labeled, unlabeled]

permissions:
  contents: read

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

jobs:
  changeset-check:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Check for skip-changeset label
        id: skip-label
        run: |
          if echo '${{ toJSON(github.event.pull_request.labels.*.name) }}' | jq -e 'index("skip-changeset")' > /dev/null 2>&1; then
            echo "skip=true" >> $GITHUB_OUTPUT
            echo "✅ skip-changeset label detected, skipping check"
          else
            echo "skip=false" >> $GITHUB_OUTPUT
          fi

      - uses: actions/checkout@v6
        if: steps.skip-label.outputs.skip != 'true'
        with:
          fetch-depth: 0

      - name: Check if only docs/CI changes
        if: steps.skip-label.outputs.skip != 'true'
        id: docs-only
        run: |
          CHANGED_FILES=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}...HEAD)
          echo "Changed files:"
          echo "$CHANGED_FILES"

          # 检查是否所有变更文件都是文档/CI 相关
          NON_DOC_FILES=$(echo "$CHANGED_FILES" | grep -v -E '^(\.github/|docs/|\.changeset/|.*\.md$)' || true)

          if [ -z "$NON_DOC_FILES" ]; then
            echo "skip=true" >> $GITHUB_OUTPUT
            echo "✅ Only docs/CI changes detected, skipping changeset check"
          else
            echo "skip=false" >> $GITHUB_OUTPUT
          fi

      - name: Check for changeset
        if: steps.skip-label.outputs.skip != 'true' && steps.docs-only.outputs.skip != 'true'
        run: |
          # 获取 PR 新增的 changeset 文件(排除 README.md 和 config.json)
          NEW_CHANGESETS=$(git diff --name-only --diff-filter=A origin/${{ github.event.pull_request.base.ref }}...HEAD -- '.changeset/*.md' | grep -v 'README.md' || true)

          if [ -z "$NEW_CHANGESETS" ]; then
            echo "❌ No changeset found!"
            echo ""
            echo "This PR is missing a changeset. Please add one by running:"
            echo ""
            echo "  yarn changeset"
            echo ""
            echo "If this change doesn't need a version bump, add the 'skip-changeset' label to this PR."
            exit 1
          else
            echo "✅ Changeset found:"
            echo "$NEW_CHANGESETS"
          fi