name: Release - Version

on:
  push:
    branches: [main]

permissions:
  contents: write
  pull-requests: write

concurrency:
  group: release-${{ github.ref }}
  cancel-in-progress: false

env:
  NODE_VERSION: "20"

jobs:
  version:
    name: Version
    runs-on: ubuntu-latest
    # Skip version commits to avoid infinite loops
    if: "!startsWith(github.event.head_commit.message, 'chore(release)')"

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Install pnpm
        uses: pnpm/action-setup@v6
        with:
          version: 9

      - uses: actions/setup-node@v6
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: pnpm

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Auto-generate changeset if missing
        run: |
          # Check if there are already pending changesets
          EXISTING=$(ls .changeset/*.md 2>/dev/null | grep -v README.md | head -1 || true)
          if [ -n "$EXISTING" ]; then
            echo "Changeset already exists, skipping auto-generation"
            exit 0
          fi

          # Detect which packages changed in the last commit
          CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || echo "")
          if [ -z "$CHANGED_FILES" ]; then
            echo "No changed files detected"
            exit 0
          fi

          # Map changed directories to package names
          PACKAGES=""
          if echo "$CHANGED_FILES" | grep -q "^packages/icons/\|^icons/\|^public/icons/\|^src/data/icons\.json"; then
            PACKAGES="$PACKAGES \"@thesvg/icons\": patch"$'\n'
          fi
          if echo "$CHANGED_FILES" | grep -q "^packages/react/"; then
            PACKAGES="$PACKAGES \"@thesvg/react\": patch"$'\n'
          fi
          if echo "$CHANGED_FILES" | grep -q "^packages/vue/"; then
            PACKAGES="$PACKAGES \"@thesvg/vue\": patch"$'\n'
          fi
          if echo "$CHANGED_FILES" | grep -q "^packages/svelte/"; then
            PACKAGES="$PACKAGES \"@thesvg/svelte\": patch"$'\n'
          fi
          if echo "$CHANGED_FILES" | grep -q "^packages/thesvg/"; then
            PACKAGES="$PACKAGES \"thesvg\": patch"$'\n'
          fi
          if echo "$CHANGED_FILES" | grep -q "^packages/cli/"; then
            PACKAGES="$PACKAGES \"@thesvg/cli\": patch"$'\n'
          fi
          if echo "$CHANGED_FILES" | grep -q "^packages/mcp/"; then
            PACKAGES="$PACKAGES \"@thesvg/mcp-server\": patch"$'\n'
          fi

          # If icons changed, also bump framework packages (they re-export icons)
          if echo "$CHANGED_FILES" | grep -q "^packages/icons/\|^icons/\|^public/icons/\|^src/data/icons\.json"; then
            for PKG in "@thesvg/react" "@thesvg/vue" "@thesvg/svelte" "thesvg"; do
              if ! echo "$PACKAGES" | grep -q "$PKG"; then
                PACKAGES="$PACKAGES \"$PKG\": patch"$'\n'
              fi
            done
          fi

          if [ -z "$PACKAGES" ]; then
            echo "No publishable package changes detected"
            exit 0
          fi

          COMMIT_MSG=$(git log -1 --pretty=format:"%s")
          CHANGESET_FILE=".changeset/auto-$(date +%s).md"
          {
            echo "---"
            echo "$PACKAGES"
            echo "---"
            echo ""
            echo "$COMMIT_MSG"
          } > "$CHANGESET_FILE"

          echo "Generated changeset: $CHANGESET_FILE"
          cat "$CHANGESET_FILE"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      # changesets/action creates a "Version Packages" PR when changesets exist.
      # It does NOT publish here - publishing happens in publish.yml after PR merge.
      - name: Create Version PR
        uses: changesets/action@v1
        with:
          commit: "chore(release): version packages"
          title: "chore(release): version packages"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
