name: All Builds

on:
  push:
  pull_request:
  workflow_dispatch:

env:
  QT_VERSION: 6.6.0

jobs:
  Qtk:
    env:
      CONFIG: -DQTK_SUBMODULES=ON -DQTK_DEBUG=OFF -DQTK_CCACHE=OFF -DQTK_GUI=ON -DQTK_PLUGINS=OFF -DQTK_EXAMPLE=ON
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        include:
          - os: ubuntu-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
            flags: -j $(nproc)
          - os: windows-latest
            cmake: -DCMAKE_PREFIX_PATH=D:/a/qtk/qtk/Qt/$QT_VERSION/mingw81_64/ $CONFIG
            flags: ''
          - os: macos-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
            flags: -j $(nproc)

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: ${{ env.QT_VERSION }}

      # Windows

      - name: Chocolatey Action
        if: matrix.os == 'windows-latest'
        uses: crazy-max/ghaction-chocolatey@v2
        with:
          args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1

      - name: Install Debian packaging dependencies
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt update -y
          sudo apt install libxcb-cursor0 -y

      - name: Configure Qtk Application
        shell: bash
        run: cmake -B build/ ${{ matrix.cmake }}

      - name: Build Qtk Application
        shell: bash
        run: cmake --build build/ --config Release --target qtk_gui ${{ matrix.flags }}

      - name: Build Qtk Example
        if: matrix.os != 'windows-latest'
        shell: bash
        run: cmake --build build/ --config Release --target qtk_example ${{ matrix.flags }}

      # Packaging

      - name: Install Qtk Application
        shell: bash
        run: cmake --install build/ --config Release --component qtk_gui

      - name: Package Qtk Application
        shell: bash
        run: cmake --build build/ --target package --config Release

      - name: Package Qtk (DEB)
        if: matrix.os == 'ubuntu-latest'
        shell: bash
        run: |
          cd build
          cpack -C Release -G DEB

      - name: Upload package artifacts (DEB)
        if: matrix.os == 'ubuntu-latest'
        uses: actions/upload-artifact@v3
        with:
          name: qtk-gui-${{ matrix.os }}
          path: |
            build/packages/*.deb

      - name: Package Qtk (WIN)
        if: matrix.os == 'windows-latest'
        shell: bash
        run: |
          cd build
          cpack -C Release -G NSIS

      - name: Upload package artifacts (WIN)
        if: matrix.os == 'windows-latest'
        uses: actions/upload-artifact@v3
        with:
          name: qtk-gui-${{ matrix.os }}
          path: |
            build/packages/*.exe

      - name: Package Qtk (OSX)
        if: matrix.os == 'macos-latest'
        shell: bash
        run: |
          cd build
          cpack -C Release -G TGZ

      - name: Upload package artifacts (OSX)
        if: matrix.os == 'macos-latest'
        uses: actions/upload-artifact@v3
        with:
          name: qtk-gui-${{ matrix.os }}
          path: |
            build/packages/*.tar.gz

      - name: Upload Qtk install directory
        uses: actions/upload-artifact@v3
        with:
          name: qtk-gui-${{ matrix.os }}-install
          path: install/*

# TODO: Enable after trimming resources.
#      - name: Package Qtk Application Sources
#        if: matrix.os != 'macos-latest'
#        shell: bash
#        run: |
#          cmake --build build/ --target package_source
#
#      - name: Upload package artifacts
#        uses: actions/upload-artifact@v3
#        with:
#          name: qtk-${{ matrix.os }}-packages
#          path: |
#            build/packages/*
#            !build/packages/_CPack_Packages/*

  Qtk-Library:
    env:
      CONFIG: -DQTK_SUBMODULES=ON -DQTK_DEBUG=OFF -DQTK_CCACHE=OFF -DQTK_GUI=OFF -DQTK_PLUGINS=OFF -DQTK_EXAMPLE=OFF
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        include:
          - os: ubuntu-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
            flags: -j $(nproc)
          - os: windows-latest
            cmake: -DCMAKE_PREFIX_PATH=D:/a/qtk/qtk/Qt/$QT_VERSION/mingw81_64/ $CONFIG
            flags: ''
          - os: macos-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
            flags: -j $(nproc)

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: ${{ env.QT_VERSION }}

      # Windows

      - name: Chocolatey Action
        if: matrix.os == 'windows-latest'
        uses: crazy-max/ghaction-chocolatey@v2
        with:
          args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1

      - name: Configure Qtk Library
        shell: bash
        run: cmake -B build/ ${{ matrix.cmake }}

      - name: Build Qtk Library
        shell: bash
        run: cmake --build build/ --config Release --target qtk_library -- ${{ matrix.flags }}

      # Packaging

      - name: Install Qtk Library
        shell: bash
        run: cmake --install build/ --config Release --prefix=$(pwd)/install --component qtk_library

      - name: Package Qtk Library
        shell: bash
        run: cmake --build build/ --target package --config Release

      - name: Package Qtk Library (DEB)
        if: matrix.os == 'ubuntu-latest'
        shell: bash
        run: |
          cd build
          cpack -C Release -G DEB

      - name: Upload package artifacts (DEB)
        if: matrix.os == 'ubuntu-latest'
        uses: actions/upload-artifact@v3
        with:
          name: libqtk-${{ matrix.os }}
          path: |
            build/packages/*.deb

      - name: Package Qtk Library (WIN)
        if: matrix.os == 'windows-latest'
        shell: bash
        run: |
          cd build
          cpack -C Release -G NSIS

      - name: Upload package artifacts (WIN)
        if: matrix.os == 'windows-latest'
        uses: actions/upload-artifact@v3
        with:
          name: qtk-${{ matrix.os }}
          path: |
            build/packages/*.exe

      - name: Package Qtk Library (OSX)
        if: matrix.os == 'macos-latest'
        shell: bash
        run: |
          cd build
          cpack -C Release -G TGZ

      - name: Upload package artifacts (OSX)
        if: matrix.os == 'macos-latest'
        uses: actions/upload-artifact@v3
        with:
          name: qtk-${{ matrix.os }}
          path: |
            build/packages/*.tar.gz

      - name: Upload libqtk install
        uses: actions/upload-artifact@v3
        if: always()
        with:
          name: libqtk-${{ matrix.os }}-install
          path: install/*

  Qtk-Plugins:
    env:
      CONFIG: -DQTK_SUBMODULES=ON -DQTK_DEBUG=OFF -DQTK_CCACHE=OFF -DQTK_GUI=OFF -DQTK_PLUGINS=ON -DQTK_EXAMPLE=OFF
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        include:
          - os: ubuntu-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
            flags: -j $(nproc)
          - os: windows-latest
            cmake: -DCMAKE_PREFIX_PATH=D:/a/qtk/qtk/Qt/$QT_VERSION/mingw81_64/ $CONFIG
            flags: ''
          - os: macos-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/ $CONFIG
            flags: -j $(nproc)

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: ${{ env.QT_VERSION }}

      - name: Chocolatey Action
        if: matrix.os == 'windows-latest'
        uses: crazy-max/ghaction-chocolatey@v2
        with:
          args: install pkgconfiglite --checksum e87b5ea3c9142256af60f2d5b917aa63b571e6a0 --checksum-type sha1

      - name: Configure Qtk Plugins
        shell: bash
        run: cmake -B build/ ${{ matrix.cmake }}

      - name: Build Qtk Plugins
        shell: bash
        run: cmake --build build/ --config Release --target qtk_plugins -- ${{ matrix.flags }}

      # Packaging

      - name: Install Qtk Plugins
        shell: bash
        run: cmake --install build/ --config Release --component qtk_plugins

  Qtk-Assimp-Targets:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        include:
          - os: ubuntu-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/
          - os: macos-latest
            cmake: -DCMAKE_PREFIX_PATH=/home/runner/work/qtk/Qt/$QT_VERSION/gcc_64/

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: ${{ env.QT_VERSION }}

      - name: Install Assimp MacOS
        if: matrix.os == 'macos-latest'
        shell: bash
        run: |
          brew install assimp

      - name: Install Assimp Ubuntu
        if: matrix.os == 'ubuntu-latest'
        shell: bash
        run: |
          sudo apt install libassimp-dev

      - name: Configure Qtk
        shell: bash
        run: cmake -B build/ ${{ matrix.cmake }} -DQTK_CCACHE=OFF -DQTK_ASSIMP_NEW_INTERFACE=ON

      - name: Build Qtk
        shell: bash
        run: cmake --build build/ --config Release