name: Release

on:
  workflow_dispatch:
    inputs:
      ref:
        description: 'Ref to build (for Pull Requests, use refs/pull/NNN/head)'
        required: true
  repository_dispatch:
    # client_payload should be the same as the inputs for workflow_dispatch.
    types:
    - Build*
  release:
    types:
    - published

jobs:
  source:
    name: Source

    uses: ./.github/workflows/release-source.yml
    secrets: inherit

  docs:
    name: Docs
    needs: source

    uses: ./.github/workflows/release-docs.yml
    secrets: inherit

    with:
      version: ${{ needs.source.outputs.version }}

  linux:
    name: Linux (Generic)
    needs: source

    uses: ./.github/workflows/release-linux.yml
    secrets: inherit

    with:
      survey_key: ${{ needs.source.outputs.survey_key }}

  macos:
    name: MacOS
    needs: source

    uses: ./.github/workflows/release-macos.yml
    secrets: inherit

    with:
      survey_key: ${{ needs.source.outputs.survey_key }}

  windows:
    name: Windows
    needs: source

    uses: ./.github/workflows/release-windows.yml
    secrets: inherit

    with:
      is_tag: ${{ needs.source.outputs.is_tag }}
      survey_key: ${{ needs.source.outputs.survey_key }}

  windows-store:
    name: Windows Store
    needs:
    - source
    - windows

    if: needs.source.outputs.is_tag == 'true'

    uses: ./.github/workflows/release-windows-store.yml
    secrets: inherit

    with:
      version: ${{ needs.source.outputs.version }}

  upload:
    name: Upload
    needs:
    - source
    - docs
    - linux
    - macos
    - windows
    - windows-store

    # As windows-store is condition, we need to check ourselves if we need to run.
    # The always() makes sure the rest is always evaluated.
    if: always() && needs.source.result == 'success' && needs.docs.result == 'success' && needs.linux.result == 'success' && needs.macos.result == 'success' && needs.windows.result == 'success' && (needs.windows-store.result == 'success' || needs.windows-store.result == 'skipped')

    runs-on: ubuntu-latest

    # This job is empty, but ensures no upload job starts before all targets finished and are successful.
    steps:
    - name: Build completed
      run: |
        true

  upload-cdn:
    name: Upload (CDN)
    needs:
    - source
    - upload

    # As windows-store is condition, we need to check ourselves if we need to run.
    # The always() makes sure the rest is always evaluated.
    # Yes, you even need to do this if you yourself don't depend on the condition.
    if: always() && needs.source.result == 'success' && needs.upload.result == 'success'

    uses: ./.github/workflows/upload-cdn.yml
    secrets: inherit

    with:
      version: ${{ needs.source.outputs.version }}
      folder: ${{ needs.source.outputs.folder }}
      trigger_type: ${{ needs.source.outputs.trigger_type }}

  upload-steam:
    name: Upload (Steam)
    needs:
    - source
    - upload

    # As windows-store is condition, we need to check ourselves if we need to run.
    # The always() makes sure the rest is always evaluated.
    # Yes, you even need to do this if you yourself don't depend on the condition.
    # Additionally, only nightlies and releases go to Steam; not PRs.
    if: always() && needs.source.result == 'success' && needs.upload.result == 'success' && (needs.source.outputs.trigger_type == 'new-master' || needs.source.outputs.trigger_type == 'new-tag')

    uses: ./.github/workflows/upload-steam.yml
    secrets: inherit

    with:
      version: ${{ needs.source.outputs.version }}
      trigger_type: ${{ needs.source.outputs.trigger_type }}

  upload-gog:
    name: Upload (GOG)
    needs:
    - source
    - upload

    # As windows-store is condition, we need to check ourselves if we need to run.
    # The always() makes sure the rest is always evaluated.
    # Yes, you even need to do this if you yourself don't depend on the condition.
    # Additionally, only releases go to GOG; not nightlies or PRs.
    if: always() && needs.source.result == 'success' && needs.upload.result == 'success' && needs.source.outputs.trigger_type == 'new-tag'

    uses: ./.github/workflows/upload-gog.yml
    secrets: inherit

    with:
      version: ${{ needs.source.outputs.version }}

  upload-windows-store:
    name: Upload (Windows Store)
    needs:
    - upload

    # Only upload final release builds to Windows Store; "-beta" or "-RC" tags should be ignored
    if: needs.source.outputs.is_tag == 'true' && !contains(needs.source.outputs.version, '-')

    uses: ./.github/workflows/upload-windows-store.yml
    secrets: inherit

    with:
      version: ${{ needs.source.outputs.version }}
      trigger_type: ${{ needs.source.outputs.trigger_type }}
