# ## Description
#
# Uses [diffcalc-sheet-generator](https://github.com/smoogipoo/diffcalc-sheet-generator) to run two builds of osu and generate an SR/PP/Score comparison spreadsheet.
#
# ## Requirements
#
# Self-hosted runner with installed:
# - `docker >= 20.10.16`
# - `docker-compose >= 2.5.1`
# - `lbzip2`
# - `jq`
#
# ## Usage
#
# The workflow can be run in two ways:
# 1. Via workflow dispatch.
# 2. By an owner of the repository posting a pull request or issue comment containing `!diffcalc`.
# For pull requests, the workflow will assume the pull request as the target to compare against (i.e. the `OSU_B` variable).
# Any lines in the comment of the form `KEY=VALUE` are treated as variables for the generator.
#
# ## Google Service Account
#
# Spreadsheets are uploaded to a Google Service Account, and exposed with read-only permissions to the wider audience.
#
# 1. Create a project at https://console.cloud.google.com
# 2. Enable the `Google Sheets` and `Google Drive` APIs.
# 3. Create a Service Account
# 4. Generate a key in the JSON format.
# 5. Encode the key as base64 and store as an **actions secret** with name **`DIFFCALC_GOOGLE_CREDENTIALS`**
#
# ## Environment variables
#
# The default environment may be configured via **actions variables**.
#
# Refer to [the sample environment](https://github.com/smoogipoo/diffcalc-sheet-generator/blob/master/.env.sample), and prefix each variable with `DIFFCALC_` (e.g. `DIFFCALC_THREADS`, `DIFFCALC_INNODB_BUFFER_SIZE`, etc...).

name: Run difficulty calculation comparison

run-name: "${{ github.event_name == 'workflow_dispatch' && format('Manual run: {0}', inputs.osu-b) || 'Automatic comment trigger' }}"

on:
  issue_comment:
    types: [ created ]
  workflow_dispatch:
    inputs:
      osu-b:
        description: "The target build of ppy/osu"
        type: string
        required: true
      ruleset:
        description: "The ruleset to process"
        type: choice
        required: true
        options:
          - osu
          - taiko
          - catch
          - mania
      converts:
        description: "Include converted beatmaps"
        type: boolean
        required: false
        default: true
      ranked-only:
        description: "Only ranked beatmaps"
        type: boolean
        required: false
        default: true
      generators:
        description: "Comma-separated list of generators (available: [sr, pp, score])"
        type: string
        required: false
        default: 'pp,sr'
      osu-a:
        description: "The source build of ppy/osu"
        type: string
        required: false
        default: 'latest'
      difficulty-calculator-a:
        description: "The source build of ppy/osu-difficulty-calculator"
        type: string
        required: false
        default: 'latest'
      difficulty-calculator-b:
        description: "The target build of ppy/osu-difficulty-calculator"
        type: string
        required: false
        default: 'latest'
      score-processor-a:
        description: "The source build of ppy/osu-queue-score-statistics"
        type: string
        required: false
        default: 'latest'
      score-processor-b:
        description: "The target build of ppy/osu-queue-score-statistics"
        type: string
        required: false
        default: 'latest'

permissions:
  pull-requests: write

env:
  EXECUTION_ID: execution-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}

defaults:
  run:
    shell: bash -euo pipefail {0}

jobs:
  check-permissions:
    name: Check permissions
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'workflow_dispatch' || contains(github.event.comment.body, '!diffcalc') }}
    steps:
      - name: Check permissions
        run: |
          ALLOWED_USERS=(smoogipoo peppy bdach frenzibyte tsunyoku stanriders)
          for i in "${ALLOWED_USERS[@]}"; do
              if [[ "${{ github.actor }}" == "$i" ]]; then
                  exit 0
              fi
          done
          exit 1

  run-diffcalc:
    name: Run spreadsheet generator
    needs: check-permissions
    uses: ./.github/workflows/_diffcalc_processor.yml
    with:
      # Can't reference env... Why GitHub, WHY?
      id: execution-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}
      head-sha: https://github.com/${{ github.repository }}/commit/${{ github.event.pull_request.head.sha || github.sha }}
      pr-url: ${{ github.event.issue.pull_request.html_url || '' }}
      pr-text: ${{ github.event.comment.body || '' }}
      dispatch-inputs: ${{ (github.event.type == 'workflow_dispatch' && toJSON(inputs)) || '' }}
    secrets:
      DIFFCALC_GOOGLE_CREDENTIALS: ${{ secrets.DIFFCALC_GOOGLE_CREDENTIALS }}

  create-comment:
    name: Create PR comment
    needs: check-permissions
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'issue_comment' && github.event.issue.pull_request }}
    steps:
      - name: Create comment
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        with:
          comment_tag: ${{ env.EXECUTION_ID }}
          message: |
            Difficulty calculation queued -- please wait! (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})

            *This comment will update on completion*

  output-cli:
    name: Info
    needs: run-diffcalc
    runs-on: ubuntu-latest
    steps:
      - name: Output info
        run: |
          echo "Target: ${{ needs.run-diffcalc.outputs.target }}"
          echo "Spreadsheet: ${{ needs.run-diffcalc.outputs.sheet }}"

  update-comment:
    name: Update PR comment
    needs: [ create-comment, run-diffcalc ]
    runs-on: ubuntu-latest
    if: ${{ always() && needs.create-comment.result == 'success' }}
    steps:
      - name: Update comment on success
        if: ${{ needs.run-diffcalc.result == 'success' }}
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        with:
          comment_tag: ${{ env.EXECUTION_ID }}
          mode: recreate
          message: |
            Target: ${{ needs.run-diffcalc.outputs.target }}
            Spreadsheet: ${{ needs.run-diffcalc.outputs.sheet }}

      - name: Update comment on failure
        if: ${{ needs.run-diffcalc.result == 'failure' }}
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        with:
          comment_tag: ${{ env.EXECUTION_ID }}
          mode: recreate
          message: |
            Difficulty calculation failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

      - name: Update comment on cancellation
        if: ${{ needs.run-diffcalc.result == 'cancelled' }}
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        with:
          comment_tag: ${{ env.EXECUTION_ID }}
          mode: delete
          message: '.' # Appears to be required by this action for non-error status code.