name: PR Style Bot

on:
  issue_comment:
    types: [created]

permissions:
  contents: write
  pull-requests: write

jobs:
  run-style-bot:
    if: >
      contains(github.event.comment.body, '@bot /style') &&
      github.event.issue.pull_request != null
    runs-on: ubuntu-latest

    steps:
      - name: Extract PR details
        id: pr_info
        uses: actions/github-script@v6
        with:
          script: |
            const prNumber = context.payload.issue.number;
            const { data: pr } = await github.rest.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: prNumber
            });
            
            // We capture both the branch ref and the "full_name" of the head repo
            // so that we can check out the correct repository & branch (including forks).
            core.setOutput("prNumber", prNumber);
            core.setOutput("headRef", pr.head.ref);
            core.setOutput("headRepoFullName", pr.head.repo.full_name);

      - name: Check out PR branch
        uses: actions/checkout@v3
        env: 
          HEADREPOFULLNAME: ${{ steps.pr_info.outputs.headRepoFullName }}
          HEADREF: ${{ steps.pr_info.outputs.headRef }}
        with:
          # Instead of checking out the base repo, use the contributor's repo name
          repository: ${{ env.HEADREPOFULLNAME }}
          ref: ${{ env.HEADREF }}
          # You may need fetch-depth: 0 for being able to push
          fetch-depth: 0
          token: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Debug
        env: 
          HEADREPOFULLNAME: ${{ steps.pr_info.outputs.headRepoFullName }}
          HEADREF: ${{ steps.pr_info.outputs.headRef }}
          PRNUMBER: ${{ steps.pr_info.outputs.prNumber }}
        run: |
          echo "PR number: ${{ env.PRNUMBER }}"
          echo "Head Ref: ${{ env.HEADREF }}"
          echo "Head Repo Full Name: ${{ env.HEADREPOFULLNAME }}"

      - name: Set up Python
        uses: actions/setup-python@v4

      - name: Install dependencies
        run: |
          pip install .[quality]

      - name: Download Makefile from main branch
        run: |
          curl -o main_Makefile https://raw.githubusercontent.com/huggingface/diffusers/main/Makefile
        
      - name: Compare Makefiles
        run: |
          if ! diff -q main_Makefile Makefile; then
            echo "Error: The Makefile has changed. Please ensure it matches the main branch."
            exit 1
          fi
          echo "No changes in Makefile. Proceeding..."
          rm -rf main_Makefile

      - name: Run make style and make quality
        run: |
          make style && make quality

      - name: Commit and push changes
        id: commit_and_push
        env: 
          HEADREPOFULLNAME: ${{ steps.pr_info.outputs.headRepoFullName }}
          HEADREF: ${{ steps.pr_info.outputs.headRef }}
          PRNUMBER: ${{ steps.pr_info.outputs.prNumber }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          echo "HEADREPOFULLNAME: ${{ env.HEADREPOFULLNAME }}, HEADREF: ${{ env.HEADREF }}"
          # Configure git with the Actions bot user
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

          # Make sure your 'origin' remote is set to the contributor's fork
          git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${{ env.HEADREPOFULLNAME }}.git"

          # If there are changes after running style/quality, commit them
          if [ -n "$(git status --porcelain)" ]; then
            git add .
            git commit -m "Apply style fixes"
            # Push to the original contributor's forked branch
            git push origin HEAD:${{ env.HEADREF }}
            echo "changes_pushed=true" >> $GITHUB_OUTPUT
          else
            echo "No changes to commit."
            echo "changes_pushed=false" >> $GITHUB_OUTPUT
          fi

      - name: Comment on PR with workflow run link
        if: steps.commit_and_push.outputs.changes_pushed == 'true'
        uses: actions/github-script@v6
        with:
          script: |
            const prNumber = parseInt(process.env.prNumber, 10);
            const runUrl = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`

            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: prNumber,
              body: `Style fixes have been applied. [View the workflow run here](${runUrl}).`
            });
        env:
          prNumber: ${{ steps.pr_info.outputs.prNumber }}
