name: PR actions

on:
  issue_comment:
    types: [created]

env:
  COMMENT: ${{ github.event.comment.body }}
  PR_NUM: ${{ github.event.issue.number }}
  USER_EMAIL: 107717825+opentelemetrybot@users.noreply.github.com
  USER_NAME: opentelemetrybot

jobs:
  fix-format:
    name: /fix:format
    runs-on: ubuntu-latest

    if: |
      github.event.issue.pull_request &&
      contains(github.event.comment.body, '/fix:format')
    permissions:
      contents: write
      pull-requests: write

    steps:
      - name: Context info
        run: |
          echo $PR_NUM
          echo $COMMENT

      - uses: actions/checkout@v4

      - name: Write start comment
        run: |
          gh pr comment $PR_NUM -b "You triggered fix:format action run at $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
        env:
          GH_TOKEN: ${{ github.token }}

      - run: gh pr checkout $PR_NUM -b "pr-action-${RANDOM}"
        env:
          GH_TOKEN: ${{ github.token }}

      - name: Create NPM cache-hash input file
        run: |
          mkdir -p tmp
          jq '{devDependencies, dependencies, engines, gitHubActionCacheKey}' package.json > tmp/package-ci.json

      - uses: actions/setup-node@v4
        with:
          node-version-file: .nvmrc
          cache: npm
          cache-dependency-path: tmp/package-ci.json

      - run: |
          npm run format
          git status
          git branch -v

      - name: Commit and push changes, if any
        run: |
          git config --local user.email "$USER_EMAIL"
          git config --local user.name "$USER_NAME"
          if [[ $(git status --porcelain) ]]; then
            git add -A
            current_branch=$(git rev-parse --abbrev-ref HEAD)
            echo current_branch=$current_branch
            # gh pr checkout sets some git configs that we can use to make sure
            # we push to the right repo & to the right branch
            remote_repo=$(git config --get branch.${current_branch}.remote)
            echo remote_repo=$remote_repo
            remote_branch=$(git config --get branch.${current_branch}.merge)
            echo remote_branch=$remote_branch
            git commit -m 'Results from /fix:format'
            git push ${remote_repo} HEAD:${remote_branch}
          else
            echo "No changes to commit"
          fi
        env:
          GH_TOKEN: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}

      - name: Report an error in the case of failure
        if: ${{ failure() || cancelled() }}
        run: |
          gh pr comment $PR_NUM -b "fix:format run failed, please check $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID for details"
        env:
          GH_TOKEN: ${{ github.token }}

  fix-refcache:
    name: /fix:refcache
    runs-on: ubuntu-latest

    if: |
      github.event.issue.pull_request &&
      contains(github.event.comment.body, '/fix:refcache')
    permissions:
      contents: write
      pull-requests: write

    env:
      DEPTH: --depth 100 # submodule clone depth

    steps:
      - name: Context info
        run: |
          echo $PR_NUM
          echo $COMMENT

      - uses: actions/checkout@v4

      - name: Write start comment
        run: |
          gh pr comment $PR_NUM -b "You triggered fix:refcache action run at $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
        env:
          GH_TOKEN: ${{ github.token }}

      # By providing a branch name the checkout will not break if a branch with the
      # same name exists already upstream (e.g. patch-X)
      - run: gh pr checkout $PR_NUM -b "pr-action-${RANDOM}"
        env:
          GH_TOKEN: ${{ github.token }}

      - name: Create NPM cache-hash input file
        run: |
          mkdir -p tmp
          jq '{devDependencies, dependencies, engines, gitHubActionCacheKey}' package.json > tmp/package-ci.json

      - uses: actions/setup-node@v4
        with:
          node-version-file: .nvmrc
          cache: npm
          cache-dependency-path: tmp/package-ci.json

      - run: npm install --omit=optional
      - run: |
          npm run check:links
          git status
          git branch -v

      - name: Commit and push changes, if any
        run: |
          git config --local user.email "$USER_EMAIL"
          git config --local user.name "$USER_NAME"
          if [[ $(git status --porcelain) ]]; then
            git add -A
            current_branch=$(git rev-parse --abbrev-ref HEAD)
            echo current_branch=$current_branch
            # gh pr checkout sets some git configs that we can use to make sure
            # we push to the right repo & to the right branch
            remote_repo=$(git config --get branch.${current_branch}.remote)
            echo remote_repo=$remote_repo
            remote_branch=$(git config --get branch.${current_branch}.merge)
            echo remote_branch=$remote_branch
            git commit -m 'Results from /fix:refcache'
            git push ${remote_repo} HEAD:${remote_branch}
          else
            echo "No changes to commit"
          fi
        env:
          GH_TOKEN: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}

      - name: Report an error in the case of failure
        if: ${{ failure() || cancelled() }}
        run: |
          gh pr comment $PR_NUM -b "fix:recache run failed, please check $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID for details"
        env:
          GH_TOKEN: ${{ github.token }}
