name: build

on:
  push:
    branches:
      - '*'
    tags:
      - 'v*.*'
      - 'snapshot-*'
      - 'tptlibsdev-*'
  pull_request:
    branches:
      - '*'

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      do_release: ${{ steps.prepare.outputs.do_release }}
      build_matrix: ${{ steps.prepare.outputs.build_matrix }}
      publish_matrix: ${{ steps.prepare.outputs.publish_matrix }}
      release_type: ${{ steps.prepare.outputs.release_type }}
      release_name: ${{ steps.prepare.outputs.release_name }}
      mod_id: ${{ steps.prepare.outputs.mod_id }}
      app_name: ${{ steps.prepare.outputs.app_name }}
      app_comment: ${{ steps.prepare.outputs.app_comment }}
      app_exe: ${{ steps.prepare.outputs.app_exe }}
      app_id: ${{ steps.prepare.outputs.app_id }}
      app_data: ${{ steps.prepare.outputs.app_data }}
      app_vendor: ${{ steps.prepare.outputs.app_vendor }}
      do_publish: ${{ steps.prepare.outputs.do_publish }}
    steps:
      - run: git config --global core.autocrlf false
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.10'
      - run: python -m pip install meson==1.2.3 ninja # TODO: go back to using latest meson once https://github.com/mesonbuild/meson/pull/12544 is live
      - id: prepare
        run: python ./.github/prepare.py
        env:
          PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
          GITHUB_REF: ${{ github.ref }}
      - if: steps.prepare.outputs.do_release == 'yes'
        id: create_release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          RELEASE_NAME: ${{ steps.prepare.outputs.release_name }}
        run: bash -c './.github/create-release.sh'
  build:
    runs-on: ${{ matrix.runs_on }}
    name: ${{ matrix.job_name }}
    needs: [prepare]
    strategy:
      fail-fast: false
      matrix: ${{ fromJSON(needs.prepare.outputs.build_matrix) }}
    defaults:
      run:
        shell: ${{ matrix.shell }}
    steps:
      - if: matrix.force_msys2_bash == 'yes'
        uses: msys2/setup-msys2@v2
        with:
          msystem: UCRT64
          update: true
          path-type: strict
          cache: true
          # this list doesn't have to mirror the one in build.sh perfectly
          # but the packages listed here get cached properly and take less time to install
          install: >-
            git
            curl
            mingw-w64-ucrt-x86_64-gcc
            mingw-w64-ucrt-x86_64-pkgconf
            mingw-w64-ucrt-x86_64-bzip2
            mingw-w64-ucrt-x86_64-luajit
            mingw-w64-ucrt-x86_64-jsoncpp
            mingw-w64-ucrt-x86_64-curl
            mingw-w64-ucrt-x86_64-SDL2
            mingw-w64-ucrt-x86_64-libpng
            mingw-w64-ucrt-x86_64-meson
            mingw-w64-ucrt-x86_64-python
            mingw-w64-ucrt-x86_64-python-pip
            mingw-w64-ucrt-x86_64-fftw
            mingw-w64-ucrt-x86_64-cmake
            mingw-w64-ucrt-x86_64-7zip
            mingw-w64-ucrt-x86_64-jq
            patch
      - run: git config --global core.autocrlf false
      - uses: actions/checkout@v4
      - if: matrix.force_msys2_bash != 'yes'
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
      - if: matrix.force_msys2_bash != 'yes'
        run: python -m pip install meson==1.2.3 ninja # TODO: go back to using latest meson once https://github.com/mesonbuild/meson/pull/12544 is live
      - if: matrix.bsh_build_platform == 'darwin'
        run: brew install bash coreutils
      - run: bash -c './.github/build.sh'
        env:
          BSH_HOST_ARCH: ${{ matrix.bsh_host_arch }}
          BSH_HOST_PLATFORM: ${{ matrix.bsh_host_platform }}
          BSH_HOST_LIBC: ${{ matrix.bsh_host_libc }}
          BSH_STATIC_DYNAMIC: ${{ matrix.bsh_static_dynamic }}
          BSH_BUILD_PLATFORM: ${{ matrix.bsh_build_platform }}
          BSH_DEBUG_RELEASE: ${{ matrix.bsh_debug_release }}
          RELEASE_NAME: ${{ needs.prepare.outputs.release_name }}
          RELEASE_TYPE: ${{ needs.prepare.outputs.release_type }}
          MOD_ID: ${{ needs.prepare.outputs.mod_id }}
          APP_NAME: ${{ needs.prepare.outputs.app_name }}
          APP_COMMENT: ${{ needs.prepare.outputs.app_comment }}
          APP_EXE: ${{ needs.prepare.outputs.app_exe }}
          APP_ID: ${{ needs.prepare.outputs.app_id }}
          APP_DATA: ${{ needs.prepare.outputs.app_data }}
          APP_VENDOR: ${{ needs.prepare.outputs.app_vendor }}
          SEPARATE_DEBUG: ${{ matrix.separate_debug }}
          PACKAGE_MODE: ${{ matrix.package_mode }}
          ASSET_PATH: ${{ matrix.asset_path }}
          DEBUG_ASSET_PATH: ${{ matrix.debug_asset_path }}
      - if: needs.prepare.outputs.do_release == 'yes' && matrix.publish == 'yes' # TODO-NTL: ship licenses
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ASSET_PATH: build/${{ matrix.asset_path }}
          ASSET_NAME: ${{ matrix.asset_name }}
        run: bash -c './.github/upload-release-asset.sh'
      - if: needs.prepare.outputs.do_release == 'yes' && matrix.publish == 'yes' && matrix.separate_debug == 'yes'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ASSET_PATH: build/${{ matrix.debug_asset_path }}
          ASSET_NAME: ${{ matrix.debug_asset_name }}
        run: bash -c './.github/upload-release-asset.sh'
      - uses: actions/upload-artifact@v4
        if: matrix.artifact == 'yes'
        with:
          path: build/${{ matrix.asset_path }}
          name: ${{ matrix.asset_name }}
      - uses: actions/upload-artifact@v4
        if: matrix.artifact == 'yes' && matrix.separate_debug == 'yes'
        with:
          path: build/${{ matrix.debug_asset_path }}
          name: ${{ matrix.debug_asset_name }}
  publish:
    runs-on: ubuntu-latest
    needs: [build, prepare]
    strategy:
      fail-fast: false
      matrix: ${{ fromJSON(needs.prepare.outputs.publish_matrix) }}
    if: needs.prepare.outputs.do_publish == 'yes'
    steps:
      - run: git config --global core.autocrlf false
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          name: ${{ matrix.asset_name }}
      - run: mv ${{ matrix.asset_path }} ${{ matrix.starcatcher_name }}
      - run: sudo apt update && sudo apt install curlftpfs && bash -c './.github/starcatcher-publish.sh'
        env:
          PUBLISH_HOSTPORT: ${{ secrets.STARCATCHER_PUBLISH_HOSTPORT }}
          PUBLISH_USERNAME: ${{ secrets.STARCATCHER_PUBLISH_USERNAME }}
          PUBLISH_PASSWORD: ${{ secrets.STARCATCHER_PUBLISH_PASSWORD }}
          PUBLISH_DIRECTORY: ${{ secrets.STARCATCHER_PUBLISH_DIRECTORY }}
          PUBLISH_FILENAME: ${{ matrix.starcatcher_name }}
  release:
    runs-on: ubuntu-latest
    needs: [build, publish, prepare]
    if: needs.prepare.outputs.do_publish == 'yes'
    steps:
      - run: git config --global core.autocrlf false
      - uses: actions/checkout@v4
      - run: ./.github/starcatcher-release.sh
        env:
          RELEASE_NAME: ${{ needs.prepare.outputs.release_name }}
          RELEASE_TYPE: ${{ needs.prepare.outputs.release_type }}
          MOD_ID: ${{ needs.prepare.outputs.mod_id }}
          GITHUB_SHA: ${{ github.sha }}
