name: Update Stable Branch

on:
  push:
    branches:
      - main

permissions:
  contents: write
  
jobs:
  prepare-release:
    if: contains(github.event.head_commit.message, '#release')
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Configure Git
        run: |
          git config --global user.name 'github-actions[bot]'
          git config --global user.email 'github-actions[bot]@users.noreply.github.com'

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install pnpm
        uses: pnpm/action-setup@v2
        with:
          version: latest
          run_install: false

      - name: Get pnpm store directory
        id: pnpm-cache
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT

      - name: Setup pnpm cache
        uses: actions/cache@v4
        with:
          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Get Current Version
        id: current_version
        run: |
          CURRENT_VERSION=$(node -p "require('./package.json').version")
          echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT

      - name: Install semver
        run: pnpm add -g semver

      - name: Determine Version Bump
        id: version_bump
        run: |
          COMMIT_MSG="${{ github.event.head_commit.message }}"
          if [[ $COMMIT_MSG =~ "#release:major" ]]; then
            echo "bump=major" >> $GITHUB_OUTPUT
          elif [[ $COMMIT_MSG =~ "#release:minor" ]]; then
            echo "bump=minor" >> $GITHUB_OUTPUT
          else
            echo "bump=patch" >> $GITHUB_OUTPUT
          fi

      - name: Bump Version
        id: bump_version
        run: |
          NEW_VERSION=$(semver -i ${{ steps.version_bump.outputs.bump }} ${{ steps.current_version.outputs.version }})
          echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT

      - name: Update Package.json
        run: |
          NEW_VERSION=${{ steps.bump_version.outputs.new_version }}
          pnpm version $NEW_VERSION --no-git-tag-version --allow-same-version

      
      - name: Prepare changelog script
        run: chmod +x .github/scripts/generate-changelog.sh

      - name: Generate Changelog
        id: changelog
        env:
          NEW_VERSION: ${{ steps.bump_version.outputs.new_version }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          
        run: .github/scripts/generate-changelog.sh

      - name: Get the latest commit hash and version tag
        run: |
          echo "COMMIT_HASH=$(git rev-parse HEAD)" >> $GITHUB_ENV
          echo "NEW_VERSION=${{ steps.bump_version.outputs.new_version }}" >> $GITHUB_ENV
          
      - name: Commit and Tag Release
        run: |
          git pull
          git add package.json pnpm-lock.yaml changelog.md
          git commit -m "chore: release version ${{ steps.bump_version.outputs.new_version }}"
          git tag "v${{ steps.bump_version.outputs.new_version }}"
          git push
          git push --tags

      - name: Update Stable Branch
        run: |
          if ! git checkout stable 2>/dev/null; then
            echo "Creating new stable branch..."
            git checkout -b stable
          fi
          git merge main --no-ff -m "chore: release version ${{ steps.bump_version.outputs.new_version }}"
          git push --set-upstream origin stable --force

      - name: Create GitHub Release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          VERSION="v${{ steps.bump_version.outputs.new_version }}"
          gh release create "$VERSION" \
            --title "Release $VERSION" \
            --notes "${{ steps.changelog.outputs.content }}" \
            --target stable