#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

# Intentionally has a general name.
# because the test status check created in GitHub Actions
# currently randomly picks any associated workflow.
# So, the name was changed to make sense in that context too.
# See also https://github.community/t/specify-check-suite-when-creating-a-checkrun/118380/10
name: On pull request update
on:
  pull_request_target:
    types: [opened, reopened, synchronize]

jobs:
  notify:
    name: Notify test workflow
    runs-on: ubuntu-20.04
    steps:
      - name: "Notify test workflow"
        uses: actions/github-script@v3
        if: ${{ github.base_ref == 'master' }}
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const endpoint = 'GET /repos/:owner/:repo/actions/workflows/:id/runs?&branch=:branch'

            // TODO: Should use pull_request.user and pull_request.user.repos_url?
            // If a different person creates a commit to another forked repo,
            // it wouldn't be able to detect.
            const params = {
              owner: context.payload.pull_request.head.repo.owner.login,
              repo: context.payload.pull_request.head.repo.name,
              id: 'build_and_test.yml',
              branch: context.payload.pull_request.head.ref,
            }

            console.log('Ref: ' + context.payload.pull_request.head.ref)
            console.log('SHA: ' + context.payload.pull_request.head.sha)

            // Wait 3 seconds to make sure the fork repository triggered a workflow.
            await new Promise(r => setTimeout(r, 3000))

            const runs = await github.request(endpoint, params)

            const name = 'Build and test'
            const head_sha = context.payload.pull_request.head.sha
            let status = 'queued'

            if (runs.data.workflow_runs.length === 0) {
              status = 'completed'
              const conclusion = 'action_required'

              github.checks.create({
                owner: context.repo.owner,
                repo: context.repo.repo,
                name: name,
                head_sha: head_sha,
                status: status,
                conclusion: conclusion,
                output: {
                  title: 'Workflow run detection failed',
                  summary: `
            Unable to detect the workflow run for testing the changes in your PR.

            1. If you did not enable GitHub Actions in your forked repository, please enable it. See also [Disabling or limiting GitHub Actions for a repository](https://docs.github.com/en/github/administering-a-repository/disabling-or-limiting-github-actions-for-a-repository) for more details.
            2. It is possible your branch is based on the old \`master\` branch in Apache Spark, please sync your branch to the latest master branch. For example as below:
                \`\`\`bash
                git fetch upstream
                git rebase upstream/master
                git push origin YOUR_BRANCH --force
                \`\`\``
                }
              })
            } else {
              const runID = runs.data.workflow_runs[0].id

              if (runs.data.workflow_runs[0].head_sha != context.payload.pull_request.head.sha) {
                throw new Error('There was a new unsynced commit pushed. Please retrigger the workflow.');
              }

              const runUrl = 'https://github.com/'
                + context.payload.pull_request.head.repo.full_name
                + '/actions/runs/'
                + runID

              github.checks.create({
                owner: context.repo.owner,
                repo: context.repo.repo,
                name: name,
                head_sha: head_sha,
                status: status,
                output: {
                  title: 'Test results',
                  summary: '[See test results](' + runUrl + ')',
                  text: JSON.stringify({
                    owner: context.payload.pull_request.head.repo.owner.login,
                    repo: context.payload.pull_request.head.repo.name,
                    run_id: runID
                  })
                },
                details_url: runUrl,
              })
            }
