name: Run commands for issues and pull requests
on:
  issues:
    types: [labeled, opened]
  issue_comment:
    types: [created]

permissions:
  contents: read
  issues: write

jobs:
  bot:
    runs-on: ubuntu-22.04
    permissions:
      pull-requests: write
      issues: write
    steps:
      - name: Checkout Actions
        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
        with:
          repository: "oam-dev/kubevela-github-actions"
          path: ./actions
          ref: v0.4.2
      - name: Setup Node.js
        uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b
        with:
          node-version: "14"
          cache: "npm"
          cache-dependency-path: ./actions/package-lock.json
      - name: Install Dependencies
        run: npm ci --production --prefix ./actions
      - name: Run Commands
        uses: ./actions/commands
        with:
          token: ${{ secrets.GH_KUBEVELA_COMMAND_WORKFLOW }}
          configPath: issue-commands

  backport:
    runs-on: ubuntu-22.04
    if: github.event.issue.pull_request && contains(github.event.comment.body, '/backport')
    permissions:
      contents: write
      pull-requests: write
      issues: write
    steps:
      - name: Extract Command
        id: command
        uses: xt0rted/slash-command-action@bf51f8f5f4ea3d58abc7eca58f77104182b23e88
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          command: backport
          reaction: "true"
          reaction-type: "eyes"
          allow-edits: "false"
          permission-level: read
      - name: Handle Command
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        env:
          VERSION: ${{ steps.command.outputs.command-arguments }}
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const version = process.env.VERSION
            let label = "backport release-" + version
            if (version.includes("release")) {
              label = "backport " + version
            }
            // Add our backport label.
            github.rest.issues.addLabels({
              // Every pull request is an issue, but not every issue is a pull request.
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              labels: [label]
            })
            console.log("Added '" + label + "' label.")
      - name: Checkout
        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
        with:
          fetch-depth: 0
      - name: Open Backport PR
        uses: zeebe-io/backport-action@0193454f0c5947491d348f33a275c119f30eb736
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          github_workspace: ${{ github.workspace }}

  retest:
    runs-on: ubuntu-22.04
    if: github.event.issue.pull_request && contains(github.event.comment.body, '/retest')
    permissions:
      actions: write
      pull-requests: write
      issues: write
    steps:
      - name: Retest the current pull request
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        env:
          PULL_REQUEST_ID: ${{ github.event.issue.number }}
          COMMENT_ID: ${{ github.event.comment.id }}
          COMMENT_BODY: ${{ github.event.comment.body }}
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const pull_request_id = process.env.PULL_REQUEST_ID
            const comment_id = process.env.COMMENT_ID
            const comment_body = process.env.COMMENT_BODY
            console.log("retest pr: #" + pull_request_id + " comment: " + comment_body)
            const {data: pr} = await github.rest.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: pull_request_id,
            })
            console.log("pr: " + JSON.stringify(pr))
            const action = comment_body.split(" ")[0]
            let workflow_ids = comment_body.split(" ").slice(1).filter(line => line.length > 0).map(line => line + ".yml")
            if (workflow_ids.length == 0) workflow_ids = ["go.yml", "unit-test.yml", "e2e-test.yml", "e2e-multicluster-test.yml"]
            for (let i = 0; i < workflow_ids.length; i++) {
              const workflow_id = workflow_ids[i]
              const {data: runs} = await github.rest.actions.listWorkflowRuns({
                owner: context.repo.owner,
                repo: context.repo.repo,
                workflow_id: workflow_id,
                head_sha: pr.head.sha,
              })
              console.log("runs for " + workflow_id + ": ", JSON.stringify(runs))
              runs.workflow_runs.forEach((workflow_run) => {
                if (workflow_run.status === "in_progress") return
                let handler = github.rest.actions.reRunWorkflow
                if (action === "/retest-failed") handler = github.rest.actions.reRunWorkflowFailedJobs
                handler({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  run_id: workflow_run.id
                })
              })
            }
            github.rest.reactions.createForIssueComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              comment_id: comment_id,
              content: "eyes",
            });
