name: Build Project
on:
  workflow_call:
jobs:
  check-event:
    name: Check GitHub Event Data 📡
    runs-on: ubuntu-22.04
    defaults:
      run:
        shell: bash
    outputs:
      package: ${{ steps.setup.outputs.package }}
      codesign: ${{ steps.setup.outputs.codesign }}
      notarize: ${{ steps.setup.outputs.notarize }}
      config: ${{ steps.setup.outputs.config }}
      commitHash: ${{ steps.setup.outputs.commitHash }}
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Check Event Data ☑️
        id: setup
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          : Check Event Data ☑️
          if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi

          case "${GITHUB_EVENT_NAME}" in
            pull_request)
              config_data=('codesign:false' 'notarize:false' 'package:false' 'config:RelWithDebInfo')
              if [[ ${{ contains(github.event.pull_request.labels.*.name, 'Seeking Testers') }} = true ]]; then
                config_data[0]='codesign:true'
                config_data[2]='package:true'
              fi
              ;;
            push)
              config_data=('codesign:true' 'notarize:false' 'package:true' 'config:RelWithDebInfo')
              if [[ ${GITHUB_REF_NAME} =~ [0-9]+.[0-9]+.[0-9]+(-(rc|beta).+)? ]]; then
                config_data[1]='notarize:true'
                config_data[3]='config:Release'
              fi
              ;;
            workflow_dispatch)
              config_data=('codesign:true' 'notarize:false' 'package:false' 'config:RelWithDebInfo')
              ;;
            schedule)
              config_data=('codesign:true' 'notarize:false' 'package:true' 'config:RelWithDebInfo')
              ;;
            *) ;;
          esac

          for config in "${config_data[@]}"; do
            IFS=':' read -r key value <<< "${config}"
            echo "${key}=${value}" >> $GITHUB_OUTPUT
          done
          echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT

  macos-build:
    name: Build for macOS 🍏
    runs-on: macos-13
    needs: check-event
    defaults:
      run:
        shell: zsh --no-rcs --errexit --pipefail {0}
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Set Up Environment 🔧
        id: setup
        run: |
          : Set Up Environment 🔧
          if (( ${+RUNNER_DEBUG} )) setopt XTRACE

          print '::group::Clean Homebrew Environment'
          typeset -a to_remove=()

          if (( #to_remove > 0 )) brew uninstall --ignore-dependencies ${to_remove}
          print '::endgroup::'

          local product_name
          local product_version
          read -r product_name product_version <<< \
            "$(jq -r '. | {name, version} | join(" ")' buildspec.json)"

          print "pluginName=${product_name}" >> $GITHUB_OUTPUT
          print "pluginVersion=${product_version}" >> $GITHUB_OUTPUT

      - uses: actions/cache@v3
        id: ccache-cache
        with:
          path: ${{ github.workspace }}/.ccache
          key: ${{ runner.os }}-ccache-${{ needs.check-event.outputs.config }}
          restore-keys: |
            ${{ runner.os }}-ccache-

      - name: Set Up Codesigning 🔑
        uses: ./.github/actions/setup-macos-codesigning
        if: ${{ fromJSON(needs.check-event.outputs.codesign) }}
        id: codesign
        with:
          codesignIdentity: ${{ secrets.MACOS_SIGNING_APPLICATION_IDENTITY }}
          installerIdentity: ${{ secrets.MACOS_SIGNING_INSTALLER_IDENTITY }}
          codesignCertificate: ${{ secrets.MACOS_SIGNING_CERT }}
          certificatePassword: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }}
          keychainPassword: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
          provisioningProfile: ${{ secrets.MACOS_SIGNING_PROVISIONING_PROFILE }}
          notarizationUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
          notarizationPassword: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}

      - name: Build Plugin 🧱
        uses: ./.github/actions/build-plugin
        with:
          target: macos-universal
          config: ${{ needs.check-event.outputs.config }}
          codesign: ${{ fromJSON(needs.check-event.outputs.codesign) }}
          codesignIdent: ${{ steps.codesign.outputs.codesignIdent }}

      - name: Package Plugin 📀
        uses: ./.github/actions/package-plugin
        with:
          target: macos-universal
          config: ${{ needs.check-event.outputs.config }}
          package: ${{ fromJSON(needs.check-event.outputs.package) }}
          codesign: ${{ fromJSON(needs.check-event.outputs.codesign) && fromJSON(steps.codesign.outputs.haveCodesignIdent) }}
          codesignIdent: ${{ steps.codesign.outputs.codesignIdent }}
          installerIdent: ${{ steps.codesign.outputs.installerIdent }}
          codesignTeam: ${{ steps.codesign.outputs.codesignTeam }}
          notarize: ${{ fromJSON(needs.check-event.outputs.notarize) && fromJSON(steps.codesign.outputs.haveNotarizationUser) }}
          codesignUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
          codesignPass: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}

      - name: Upload Artifacts 📡
        uses: actions/upload-artifact@v3
        with:
          name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-macos-universal-${{ needs.check-event.outputs.commitHash }}
          path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-macos-universal.*

      - name: Upload Debug Symbol Artifacts 🪲
        uses: actions/upload-artifact@v3
        if: ${{ needs.check-event.outputs.config == 'Release' }}
        with:
          name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-macos-universal-${{ needs.check-event.outputs.commitHash }}-dSYMs
          path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-macos-universal-dSYMs.*

  ubuntu-build:
    name: Build for Ubuntu 🐧
    runs-on: ubuntu-22.04
    needs: check-event
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Set Up Environment 🔧
        id: setup
        run: |
          : Set Up Environment 🔧
          if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi

          read -r product_name product_version <<< \
            "$(jq -r '. | {name, version} | join(" ")' buildspec.json)"

          echo "pluginName=${product_name}" >> $GITHUB_OUTPUT
          echo "pluginVersion=${product_version}" >> $GITHUB_OUTPUT

      - uses: actions/cache@v3
        id: ccache-cache
        with:
          path: ${{ github.workspace }}/.ccache
          key: ${{ runner.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
          restore-keys: |
            ${{ runner.os }}-ccache-x86_64-

      - name: Set up Homebrew 🍺
        uses: Homebrew/actions/setup-homebrew@master

      - name: Build Plugin 🧱
        uses: ./.github/actions/build-plugin
        with:
          target: x86_64
          config: ${{ needs.check-event.outputs.config }}

      - name: Package Plugin 📀
        uses: ./.github/actions/package-plugin
        with:
          package: ${{ fromJSON(needs.check-event.outputs.package) }}
          target: x86_64
          config: ${{ needs.check-event.outputs.config }}

      - name: Upload Source Tarball 🗜️
        uses: actions/upload-artifact@v3
        with:
          name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-sources-${{ needs.check-event.outputs.commitHash }}
          path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-source.*

      - name: Upload Artifacts 📡
        uses: actions/upload-artifact@v3
        with:
          name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-ubuntu-22.04-x86_64-${{ needs.check-event.outputs.commitHash }}
          path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-x86_64*.*

      - name: Upload debug symbol artifacts 🪲
        uses: actions/upload-artifact@v3
        if: ${{ fromJSON(needs.check-event.outputs.package) }}
        with:
          name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-ubuntu-22.04-x86_64-${{ needs.check-event.outputs.commitHash }}-dbgsym
          path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-x86_64*-dbgsym.ddeb

  windows-build:
    name: Build for Windows 🪟
    runs-on: windows-2022
    needs: check-event
    defaults:
      run:
        shell: pwsh
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Set Up Environment 🔧
        id: setup
        run: |
          # Set Up Environment 🔧
          if ( $Env:RUNNER_DEBUG -ne $null ) {
            Set-PSDebug -Trace 1
          }

          $BuildSpec = Get-Content -Path buildspec.json -Raw | ConvertFrom-Json
          $ProductName = $BuildSpec.name
          $ProductVersion = $BuildSpec.version

          "pluginName=${ProductName}" >> $env:GITHUB_OUTPUT
          "pluginVersion=${ProductVersion}" >> $env:GITHUB_OUTPUT

      - name: Build Plugin 🧱
        uses: ./.github/actions/build-plugin
        with:
          target: x64
          config: ${{ needs.check-event.outputs.config }}

      - name: Package Plugin 📀
        uses: ./.github/actions/package-plugin
        with:
          target: x64
          config: ${{ needs.check-event.outputs.config }}
          package: ${{ fromJSON(needs.check-event.outputs.package) }}

      - name: Upload Artifacts 📡
        uses: actions/upload-artifact@v3
        with:
          name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-windows-x64-${{ needs.check-event.outputs.commitHash }}
          path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-windows-x64*.*
