name: Build
on: [ push ]

jobs:
  windows:
    strategy:
      matrix:
        include:
          - { sys: clang64, env: clang-x86_64 }
        configuration: [ Release, Debug ]

    name: Windows
    runs-on: windows-latest

    defaults:
      run:
        shell: msys2 {0}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          submodules: recursive
 
      - name: Set up MSYS2 and install required packages
        uses: msys2/setup-msys2@v2
        with:
          msystem: ${{ matrix.sys }}
          install: >-
            mingw-w64-${{ matrix.env }}-${{ matrix.sys == 'clang64' && 'clang' || 'gcc' }}
            mingw-w64-${{ matrix.env }}-cmake
            mingw-w64-${{ matrix.env }}-ninja
            mingw-w64-${{ matrix.env }}-boost
            mingw-w64-${{ matrix.env }}-pugixml
            mingw-w64-${{ matrix.env }}-ogre3d
            mingw-w64-${{ matrix.env }}-qt6
            mingw-w64-${{ matrix.env }}-bullet
      
      - name: Generate Ninja build files
        run: cmake -G Ninja -B build -DCI=ON -DCMAKE_BUILD_TYPE=${{ matrix.configuration == 'Release' && 'MinSizeRel' || matrix.configuration }} .
      
      - name: Run Ninja build
        run: ninja -C build
      
      # ouch - unless and until we start using CMake's install command, these next few steps are a necessary evil
      - name: Organize binaries
        run: mkdir build/dist && mv build/*.exe build/dist

      - name: Add RNR resources
        run: cp -R Content/RNR build/dist/content && cp LICENSE build/dist

      - name: Add Qt plugins and dependencies
        run: windeployqt6 build/dist/*.exe

      - name: Add OGRE plugins
        run: cp Content/win32_plugins.cfg build/dist/plugins.cfg && mkdir build/dist/plugins/ && cat build/dist/plugins.cfg | grep "Plugin=" | sed -e "s/Plugin=//" | xargs -I '{}' cp -v '/${{ matrix.sys }}/bin/{}.dll' build/dist/plugins/
      
      - name: Add OGRE shaders
        run: mkdir build/dist/shaders && cp -R /${{ matrix.sys }}/share/OGRE/Media/Main/* build/dist/shaders && cp -R /${{ matrix.sys }}/share/OGRE/Media/RTShaderLib/* build/dist/shaders
    
      - name: Add additional runtime dependencies
        run: ldd build/dist/*.exe | grep "=> /" | awk '{print $3}' | grep "${{ matrix.sys }}" | xargs -I '{}' cp -v '{}' build/dist
      
      - name: Set output variables
        id: vars
        run: |
          echo "configuration=${{ matrix.configuration }}" | awk '{print tolower($0)}' >> $GITHUB_OUTPUT
          echo "hash=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT
      
      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: rnr-${{ steps.vars.outputs.hash }}-win_x64-${{ steps.vars.outputs.configuration }}
          path: build/dist
