# Whenever a commit is pushed to master (ideally via a pull-request!)
# this action will create the next release, which means:
# 1. tag master with the proper version
# 2. create a new draft release (pre-released if a nightly build)
# 3. add release notes

name: 🏭 Create Release

on:
  push:
    branches:
      - master
  workflow_dispatch:
    inputs:
      is_prelease:
        description: 'Should be a pre-release?'
        required: true
        default: 'true'
        type: choice
        options:
          - 'true'
          - 'false'
      tag_value:
        description: 'Create a new release from latest master with the given tag, if this is left blank it will bump the patch version. You dont need to include the "v" prefix'
        required: false

permissions:
  contents: write

jobs:
  cut-release:
    if: github.repository == 'PCSX2/pcsx2'
    name: "Create Tag and Release"
    runs-on: ubuntu-latest
    outputs:
      new_tag: ${{ steps.tag_version.outputs.new_tag }}
    steps:
      - uses: actions/checkout@v4

      # Docs - https://github.com/mathieudutour/github-tag-action
      - name: Bump Version and Push Tag
        id: tag_version
        uses: mathieudutour/github-tag-action@v6.2
        with:
          github_token: ${{ github.token }}
          tag_prefix: v
          default_bump: patch
          # if set, it will overwrite the bump settings
          custom_tag: ${{ github.event.inputs.tag_value == '' && null || github.event.inputs.tag_value }}

      # TODO - we could do this and remove the node.js script, but auto-generated notes only work
      # with PRs -- not commits (determine how much we care).
      # - name: Create Draft Release
      #   run: |
      #     echo "Creating release with tag - ${{ steps.tag_version.outputs.new_tag }}"
      #     gh release create ${{ steps.tag_version.outputs.new_tag }} --draft --generate-notes -title ${{ steps.tag_version.outputs.new_tag }}

      - name: Generate Release Notes
        env:
          OWNER: PCSX2
          REPO: pcsx2
          GITHUB_TOKEN: ${{ github.token }}
          COMMIT_SHA: ${{ github.SHA }}
        run: |
          cd ./.github/workflows/scripts/releases/generate-release-notes
          npm ci
          node index.js
          mv ./release-notes.md ${GITHUB_WORKSPACE}/release-notes.md

      - name: Create a GitHub Release (Manual)
        uses: softprops/action-gh-release@v2
        if: steps.tag_version.outputs.new_tag && github.event_name == 'workflow_dispatch'
        with:
          body_path: ./release-notes.md
          draft: true
          prerelease: ${{ github.event_name != 'workflow_dispatch' || inputs.is_prelease == 'true' }}
          tag_name: ${{ steps.tag_version.outputs.new_tag }}

      - name: Create a GitHub Release (Push)
        uses: softprops/action-gh-release@v2
        if: steps.tag_version.outputs.new_tag && github.event_name != 'workflow_dispatch'
        with:
          body_path: ./release-notes.md
          draft: true
          prerelease: true
          tag_name: ${{ steps.tag_version.outputs.new_tag }}

  # Build Everything
  # Linux
  build_linux_qt:
    if: github.repository == 'PCSX2/pcsx2'
    needs:
      - cut-release
    name: "Linux"
    uses: ./.github/workflows/linux_build_qt.yml
    with:
      jobName: "AppImage Build"
      artifactPrefixName: "PCSX2-linux-Qt-x64-appimage"
      compiler: clang
      cmakeflags: ""
      buildAppImage: true
      fetchTags: true
      stableBuild: ${{ github.event_name == 'workflow_dispatch' && inputs.is_prelease == 'false' }}
    secrets: inherit

  build_linux_flatpak:
    if: github.repository == 'PCSX2/pcsx2'
    needs:
      - cut-release
    name: "Linux"
    uses: ./.github/workflows/linux_build_flatpak.yml
    with:
      jobName: "Flatpak Build"
      artifactPrefixName: "PCSX2-linux-Qt-x64-flatpak"
      compiler: clang
      cmakeflags: ""
      branch: "stable"
      publish: false
      fetchTags: true
      stableBuild: ${{ github.event_name == 'workflow_dispatch' && inputs.is_prelease == 'false' }}
    secrets: inherit

  # Windows
  build_windows_qt:
    if: github.repository == 'PCSX2/pcsx2'
    needs:
      - cut-release
    name: "Windows"
    uses: ./.github/workflows/windows_build_qt.yml
    with:
      jobName: "Windows Build"
      artifactPrefixName: "PCSX2-windows-Qt-x64"
      configuration: CMake
      buildSystem: cmake
      cmakeFlags: -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
      fetchTags: true
      stableBuild: ${{ github.event_name == 'workflow_dispatch' && inputs.is_prelease == 'false' }}
    secrets: inherit

  # MacOS
  build_macos_qt:
    if: github.repository == 'PCSX2/pcsx2'
    needs:
      - cut-release
    name: "MacOS"
    uses: ./.github/workflows/macos_build.yml
    with:
      jobName: "MacOS Build"
      artifactPrefixName: "PCSX2-macos-Qt"
      fetchTags: true
      stableBuild: ${{ github.event_name == 'workflow_dispatch' && inputs.is_prelease == 'false' }}
    secrets: inherit

  # Upload the Artifacts
  upload_artifacts:
    if: github.repository == 'PCSX2/pcsx2'
    needs:
      - cut-release
      - build_linux_flatpak
      - build_linux_qt
      - build_windows_qt
      - build_macos_qt
    name: "Upload Artifacts"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Prepare Artifact Folder
        run: mkdir ./ci-artifacts/

      - uses: actions/download-artifact@v4
        name: Download all Artifacts
        with:
          path: ./ci-artifacts/

      - name: Display structure of downloaded files
        run: ls ./ci-artifacts/

      # Prepare artifacts, they are all zips from github!
      - name: Prepare Artifacts
        working-directory: ./ci-artifacts/
        run: for d in *windows*/; do 7z a "${d}asset.7z" ./$d/*; done

      - name: Name and Upload the Release Assets
        env:
          GITHUB_TOKEN: ${{ github.token }}
          SCAN_DIR: ${{ github.WORKSPACE }}/ci-artifacts
          OUT_DIR: ${{ github.WORKSPACE }}/ci-artifacts/out
        run: |
          TAG_VAL=${{needs.cut-release.outputs.new_tag}}
          echo "TAG_VAL=${TAG_VAL}"
          gh release list --repo PCSX2/pcsx2
          mkdir -p ${{ github.WORKSPACE }}/ci-artifacts/out
          TAG_VAL=${TAG_VAL} python ./.github/workflows/scripts/releases/rename-release-assets.py
          ls ${{ github.WORKSPACE }}/ci-artifacts/out
          gh release upload "${TAG_VAL}" ${{ github.WORKSPACE }}/ci-artifacts/out/*  --repo PCSX2/pcsx2 --clobber

      - name: Publish Release
        env:
          GITHUB_TOKEN: ${{ github.token }}
        run: |
          TAG_VAL=${{needs.cut-release.outputs.new_tag}}
          echo "TAG_VAL=${TAG_VAL}"
          gh release edit ${TAG_VAL} --draft=false --repo PCSX2/pcsx2

      - uses: actions/setup-node@v4
        with:
          node-version: 16

      - name: Announce Release
        env:
          OWNER: PCSX2
          REPO: pcsx2
          DISCORD_BUILD_WEBHOOK: ${{ secrets.DISCORD_BUILD_WEBHOOK }}
          GITHUB_TOKEN: ${{ github.token }}
        run: |
          TAG_VAL=${{needs.cut-release.outputs.new_tag}}
          cd ./.github/workflows/scripts/releases/announce-release
          npm ci
          TAG_VAL=${TAG_VAL} node index.js