# This workflow is the second part of the process described in
# .github/workflows/qhelp-pr-preview.yml
# See that file for more info.

name: Post PR comment
on:
  workflow_run:
    workflows: [Render QHelp changes]
    types:
      - completed

permissions:
  pull-requests: write
  actions: read

jobs:
  post_comment:
    runs-on: ubuntu-latest
    steps:
      - name: Download artifact
        run: gh run download "${WORKFLOW_RUN_ID}" --repo "${GITHUB_REPOSITORY}" --name "comment"
        env:
          GITHUB_TOKEN: ${{ github.token }}
          WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }}

      - name: Check that PR SHA matches workflow SHA
        run: |
          PR="$(grep -o '^[0-9]\+$' pr_number.txt)"
          PR_HEAD_SHA="$(gh api "/repos/${GITHUB_REPOSITORY}/pulls/${PR}" --jq .head.sha)"
          # Check that the pull-request head SHA matches the head SHA of the workflow run
          if [ "${WORKFLOW_RUN_HEAD_SHA}" != "${PR_HEAD_SHA}" ]; then
            echo "PR head SHA ${PR_HEAD_SHA} does not match workflow_run event SHA ${WORKFLOW_RUN_HEAD_SHA}. Stopping." 1>&2
            exit 1
          fi
        env:
          GITHUB_TOKEN: ${{ github.token }}
          WORKFLOW_RUN_HEAD_SHA: ${{ github.event.workflow_run.head_commit.id }}

      - name: Create or update comment
        run: |
          COMMENT_PREFIX="QHelp previews"
          COMMENT_AUTHOR="github-actions[bot]"
          PR_NUMBER="$(grep -o '^[0-9]\+$' pr_number.txt)"

          # If there is no existing comment, comment_id.txt will contain just a
          # newline (due to jq & gh behaviour). This will cause grep to fail, so
          # we catch that.
          RAW_COMMENT_ID=$(grep -o '^[0-9]\+$' comment_id.txt || true)

          if [ $RAW_COMMENT_ID ]
          then
            # Fetch existing comment, and validate:
            # - comment belongs to the PR with number $PR_NUMBER
            # - comment starts with the expected prefix ("QHelp previews")
            # - comment author is github-actions[bot]
            FILTER='select(.issue_url | endswith($repo+"/issues/"+$pr))
                  | select(.body | startswith($prefix))
                  | select(.user.login == $author)
                  | .id'
            COMMENT_ID=$(gh api "repos/${GITHUB_REPOSITORY}/issues/comments/${RAW_COMMENT_ID}" | jq --arg repo "${GITHUB_REPOSITORY}" --arg pr "${PR_NUMBER}" --arg prefix "${COMMENT_PREFIX}" --arg author "${COMMENT_AUTHOR}" "${FILTER}")
            if [ $COMMENT_ID ]
            then
              # Update existing comment
              jq --rawfile body comment_body.txt '{"body":$body}' -n | gh api "repos/${GITHUB_REPOSITORY}/issues/comments/${COMMENT_ID}" -X PATCH --input -
            else
              echo "Comment ${RAW_COMMENT_ID} did not pass validations: not editing." >&2
              exit 1
            fi
          else
            # Create new comment
            jq --rawfile body comment_body.txt '{"body":$body}' -n | gh api "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" -X POST --input -
          fi
        env:
          GITHUB_TOKEN: ${{ github.token }}
