name: Create Release Workflow

env:
  GH_TOKEN: ${{ github.token }}

on:
  pull_request:
    branches:
      - master

jobs:
  release:
    runs-on: ubuntu-latest
    outputs:
      bump_type: ${{ steps.determine_bump_type.outputs.bump_type }}
      package_version: ${{ steps.get_version.outputs.package_version }}
      release_branch: ${{ steps.create_release_branch.outputs.release_branch }}
      pr_number: ${{ steps.determine_bump_type.outputs.pr_number }}

    steps:
      - name: Checkout Code
        uses: actions/checkout@v2

      - name: Install Changeset CLI
        run: npm install @changesets/cli

      - name: Determine Bump Type
        id: determine_bump_type
        run: |
          # Get the pull request number from the event payload
          PR_NUMBER="${{ github.event.pull_request.number }}"
          echo "::set-output name=pr_number::$PR_NUMBER"

          # List changed files in the pull request using GitHub API
          CHANGED_FILES=$(curl -s "https://api.github.com/repos/${{ github.repository }}/pulls/$PR_NUMBER/files" | jq -r '.[].filename')

          echo "Changed Files: $CHANGED_FILES"

          # Search for changeset files in the list of changed files
          CHG_FILE=$(echo "$CHANGED_FILES" | grep -E "\.changeset/.*\.md$" | head -n 1)

          echo "Changeset File: $CHG_FILE"

          if [ -n "$CHG_FILE" ]; then
            BUMP_TYPE=$(grep -oP "semantic-styles': (major|minor|patch)" "$CHG_FILE" | sed 's/.*: //')
            echo "::set-output name=bump_type::$BUMP_TYPE"
          else
            echo "::error::No changeset file found."
            exit 1
          fi

      - name: Update Package Version
        if: steps.determine_bump_type.outputs.bump_type
        run: |
          BUMP_TYPE="${{ steps.determine_bump_type.outputs.bump_type }}"
          case $BUMP_TYPE in
            major)
              npm run changeset:major
              ;;
            minor)
              npm run changeset:minor
              ;;
            patch)
              npm run changeset:patch
              ;;
            *)
              echo "::error::Invalid BUMP_TYPE: $BUMP_TYPE"
              exit 1
              ;;
          esac

      - name: Get Package Version
        id: get_version
        run: |
          PACKAGE_VERSION=$(node -p "require('./package.json').version")
          echo "::set-output name=package_version::$PACKAGE_VERSION"

      - name: Create and Push to Release PR
        id: create_release_branch
        if: steps.get_version.outputs.package_version
        run: |
          PACKAGE_VERSION="${{ steps.get_version.outputs.package_version }}"
          RELEASE_BRANCH="release/$PACKAGE_VERSION"
          git checkout -b "$RELEASE_BRANCH"
          git config user.name "Tanner Gaucher"
          git config --global user.email "tannermichaelgaucher@gmail.com"
          git add CHANGELOG.md package.json
          git commit -am "Release $PACKAGE_VERSION"
          git push origin "$RELEASE_BRANCH"
          echo "::set-output name=release_branch::$RELEASE_BRANCH"

      - name: Create a Pull Request for the Release Branch
        if: steps.create_release_branch.outputs.release_branch
        run: |
          RELEASE_BRANCH="${{ steps.create_release_branch.outputs.release_branch }}"
          gh pr create --base master --head "$RELEASE_BRANCH" --title "$RELEASE_BRANCH" --body "$RELEASE_BRANCH"

      - name: Delete Initial Pull Request
        if: steps.determine_bump_type.outputs.pr_number
        run: |
          PR_NUMBER="${{ steps.determine_bump_type.outputs.pr_number }}"
          gh pr close "$PR_NUMBER"
