name: Build

on: [push, pull_request]

jobs:
  windows:
    name: Windows MSYS2
    strategy:
      fail-fast: false
      matrix:
        msystem: [MINGW32, MINGW64, UCRT64, CLANG64]
        include:
          - msystem: MINGW32
            packagePrefix: mingw-w64-i686
          - msystem: MINGW64
            packagePrefix: mingw-w64-x86_64
          - msystem: UCRT64
            packagePrefix: mingw-w64-ucrt-x86_64
          - msystem: CLANG64
            packagePrefix: mingw-w64-clang-x86_64
    runs-on: windows-latest
    defaults:
      run:
        shell: msys2 {0}

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup
        uses: msys2/setup-msys2@v2
        with:
          msystem: ${{ matrix.msystem }}
          update: true
          install: ${{ matrix.packagePrefix }}-toolchain ${{ matrix.packagePrefix }}-qt5-static

      - name: Build
        run: |
          mkdir build && pushd build
          $MSYSTEM_PREFIX/qt5-static/bin/qmake PREFIX=$GITHUB_WORKSPACE/pkg $GITHUB_WORKSPACE/Red_Panda_CPP.pro
          mingw32-make -j$(nproc)
          mingw32-make install
          popd

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Windows MSYS2 - msystem=${{ matrix.msystem }}
          path: pkg/

  windows_legacy:
    name: Windows NT 5.1–6.0 MinGW
    strategy:
      fail-fast: false
      matrix:
        arch: [32, 64]
    runs-on: windows-2019
    defaults:
      run:
        shell: bash
    env:
      _MINGW_TOOLCHAIN: /c/Qt/Tools/mingw810_${{ matrix.arch }}
      _QT_INSTALL_PREFIX: /c/Qt/5.6.4/mingw81_${{ matrix.arch }}-redpanda
      _REDPANDA_QT_BUILD: "20240301.0"
      _REDPANDA_QT_ARCHIVE: qt5.6.4-mingw81_${{ matrix.arch }}-redpanda.7z

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup toolchain
        uses: jurplel/install-qt-action@v3
        with:
          version: '5.15.2'
          host: windows
          target: desktop
          arch: win${{ matrix.arch }}_mingw81
          archives: qtbase
          tools: tools_mingw,qt.tools.win${{ matrix.arch }}_mingw810
          dir: C:/

      - name: Setup Qt
        run: |
          curl -LO https://github.com/redpanda-cpp/qtbase-5.6/releases/download/$_REDPANDA_QT_BUILD/$_REDPANDA_QT_ARCHIVE
          7z x $_REDPANDA_QT_ARCHIVE -oC:/Qt

      - name: Build
        run: |
          export PATH="$_QT_INSTALL_PREFIX/bin:$_MINGW_TOOLCHAIN/bin:$PATH"

          mkdir build && pushd build
          {
            qmake PREFIX=$GITHUB_WORKSPACE/pkg $GITHUB_WORKSPACE/Red_Panda_CPP.pro
            mingw32-make -j$(nproc)
            mingw32-make install
          }
          popd

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Windows NT 5.1–6.0 MinGW - arch=${{ matrix.arch }}
          path: pkg/

  windows_msvc_x64:
    name: Windows MSVC x64
    runs-on: windows-2019

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup
        uses: jurplel/install-qt-action@v3
        with:
          version: '5.15.2'
          host: windows
          target: desktop
          arch: win64_msvc2019_64
          archives: qtbase qtsvg qttools
          tools: tools_qtcreator,qt.tools.qtcreator

      - name: Build
        run: |
          $JOM = "${Env:RUNNER_WORKSPACE}/Qt/Tools/QtCreator/bin/jom/jom.exe"
          $VS_INSTALL_PATH = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise"
          Import-Module "$VS_INSTALL_PATH\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
          Enter-VsDevShell -VsInstallPath "$VS_INSTALL_PATH" -SkipAutomaticLocation -DevCmdArguments -arch=amd64
          mkdir build && pushd build
          qmake PREFIX=${Env:GITHUB_WORKSPACE}/pkg ${Env:GITHUB_WORKSPACE}/Red_Panda_CPP.pro
          & $JOM "-j${Env:NUMBER_OF_PROCESSORS}"
          & $JOM install
          windeployqt ${Env:GITHUB_WORKSPACE}/pkg/RedPandaIDE.exe
          rm ${Env:GITHUB_WORKSPACE}/pkg/vc_redist.x64.exe
          popd

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Windows MSVC x64
          path: pkg/

  windows_msvc_arm64ec:
    name: Windows MSVC ARM64EC
    runs-on: windows-2019

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup
        uses: jurplel/install-qt-action@v3
        with:
          version: '5.15.2'
          host: windows
          target: desktop
          arch: win64_msvc2019_64
          archives: qtbase qtsvg qttools
          tools: tools_qtcreator,qt.tools.qtcreator

      - name: Build
        run: |
          $JOM = "${Env:RUNNER_WORKSPACE}/Qt/Tools/QtCreator/bin/jom/jom.exe"
          $VS_INSTALL_PATH = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise"
          Import-Module "$VS_INSTALL_PATH\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
          Enter-VsDevShell -VsInstallPath "$VS_INSTALL_PATH" -SkipAutomaticLocation -DevCmdArguments "-arch=arm64 -host_arch=amd64"
          mkdir build && pushd build
          qmake QMAKE_CFLAGS="/arm64EC" QMAKE_CXXFLAGS="/arm64EC" QMAKE_LFLAGS="/MACHINE:ARM64EC" QMAKE_LIBFLAGS="/MACHINE:ARM64X" PREFIX=${Env:GITHUB_WORKSPACE}/pkg ${Env:GITHUB_WORKSPACE}/Red_Panda_CPP.pro
          & $JOM "-j${Env:NUMBER_OF_PROCESSORS}"
          & $JOM install
          windeployqt ${Env:GITHUB_WORKSPACE}/pkg/RedPandaIDE.exe
          rm ${Env:GITHUB_WORKSPACE}/pkg/vc_redist.x64.exe
          popd

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Windows MSVC ARM64EC (do not use)
          path: pkg/

  debian:
    name: Debian
    strategy:
      fail-fast: false
      matrix:
        arch: [amd64, i386]
        version: ["11", "12"]
        include:
          - arch: amd64
            platform: linux/amd64
          - arch: i386
            platform: linux/386

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform ${{ matrix.platform }} docker.io/${{ matrix.arch }}/debian:${{ matrix.version }}

      - name: Build
        run: |
          podman run --rm -e SOURCE_DIR=/src -v $GITHUB_WORKSPACE:/src --platform linux/amd64 debian:${{ matrix.version }} /src/packages/debian/01-in-docker.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Debian ${{ matrix.version }} ${{ matrix.arch }}
          path: dist/*.deb

  ubuntu:
    name: Ubuntu
    strategy:
      fail-fast: false
      matrix:
        version: ["22.04", "23.10", "devel"]
    
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform linux/amd64 docker.io/amd64/ubuntu:${{ matrix.version }}

      - name: Build
        run: |
          podman run --rm -e SOURCE_DIR=/src -v $GITHUB_WORKSPACE:/src --platform linux/amd64 ubuntu:${{ matrix.version }} /src/packages/debian/01-in-docker.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Ubuntu ${{ matrix.version }} amd64
          path: dist/*.deb

  archlinux:
    name: Arch Linux
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform linux/amd64 docker.io/amd64/archlinux:latest

      - name: Build
        run: |
          podman run --security-opt seccomp=unconfined --rm -e SOURCE_DIR=/src -v $GITHUB_WORKSPACE:/src --platform linux/amd64 docker.io/amd64/archlinux:latest /src/packages/archlinux/01-in-docker.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Arch Linux
          path: dist/*.pkg.tar.zst

  rpm_fedora:
    name: RPM on latest Fedora
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform linux/amd64 docker.io/amd64/fedora:latest

      - name: Build
        run: |
          podman run --security-opt seccomp=unconfined --rm -e SOURCE_DIR=/src -v $GITHUB_WORKSPACE:/src --platform linux/amd64 docker.io/amd64/fedora:latest /src/packages/fedora/01-in-docker.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: RPM on latest Fedora
          path: dist/*.rpm

  # rpm_opensuse:
  #   name: RPM on openSUSE Tumbleweed
  #   runs-on: ubuntu-latest

  #   steps:
  #     - uses: actions/checkout@v2
  #       with:
  #         fetch-depth: 0

  #     - name: Fetch container image
  #       run: |
  #         podman pull --platform linux/amd64 docker.io/opensuse/tumbleweed:latest

  #     - name: Build
  #       run: |
  #         podman run --security-opt seccomp=unconfined --rm -e SOURCE_DIR=/src -v $GITHUB_WORKSPACE:/src --platform linux/amd64 docker.io/opensuse/tumbleweed:latest /src/packages/opensuse/01-in-docker.sh

  #     - name: Upload
  #       uses: actions/upload-artifact@v2
  #       with:
  #         name: RPM on openSUSE Tumbleweed
  #         path: dist/*.rpm

  musl:
    name: musl-based Linux (latest Alpine)
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform linux/amd64 docker.io/amd64/alpine:latest

      - name: Build
        run: |
          podman run --rm -e SOURCE_DIR=/src -v $GITHUB_WORKSPACE:/src --platform linux/amd64 docker.io/amd64/alpine:latest /src/packages/alpine/01-in-docker.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: musl-based Linux (latest Alpine)
          path: dist/*.apk

  appimage:
    name: Linux AppImage
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform linux/amd64 quay.io/redpanda-cpp/appimage-builder-x86_64:20240304.0

      - name: Build
        run: |
          podman run --rm -v $PWD:/mnt -w /mnt -e CARCH=x86_64 quay.io/redpanda-cpp/appimage-builder-x86_64:20240304.0 packages/appimage/01-in-docker.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Linux AppImage
          path: dist/*.AppImage

  static-deb:
    name: Static Deb
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Fetch container image
        run: |
          podman pull --platform linux/amd64 quay.io/redpanda-cpp/appimage-builder-x86_64:20240304.0

      - name: Build
        run: |
          packages/debian-static/builddeb.sh

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: Static Deb
          path: dist/*.deb

  macos_x86_64:
    name: macOS x86_64
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup
        uses: jurplel/install-qt-action@v3
        with:
          version: '5.15.2'
          host: mac
          target: desktop
          arch: clang_64
          archives: qtbase qtsvg qttools
          tools: tools_qtcreator,qt.tools.qtcreator

      - name: Build
        run: |
          mkdir build && pushd build
          qmake PREFIX=$GITHUB_WORKSPACE/pkg $GITHUB_WORKSPACE/Red_Panda_CPP.pro
          make -j$(nproc)
          make install
          popd

          pushd $GITHUB_WORKSPACE/pkg/bin
          macdeployqt RedPandaIDE.app
          tar -cJf RedPandaIDE.tar.xz RedPandaIDE.app

      - name: Upload
        uses: actions/upload-artifact@v2
        with:
          name: macOS x86_64
          path: pkg/bin/RedPandaIDE.tar.xz