name: Check Builds

on:
  push:
    paths:
        - src/**
        - vendor/**
        - .github/workflows/check-builds.yaml
        - CMakeLists.txt
        - Makefile
  pull_request:
    types: ready_for_review
    paths:
        - src/**
        - vendor/**
        - CMakeLists.txt
        - Makefile

jobs:
  ubuntu-build:
    runs-on: ubuntu-latest
    steps:
      - name: Set environment
        run: echo "SHORT_SHA=${GITHUB_SHA::7}" >> $GITHUB_ENV
        shell: bash
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Install dependencies
        run: sudo apt install clang cmake snap -y && sudo snap install powershell --classic
      - name: Check compilation
        run: |
          $versions = "104", "728", "1013"

          foreach ($version in $versions) {
              Write-Output "Cleaning old output"
              Invoke-Expression "make clean"
              if ($LASTEXITCODE -ne "0") {
                  Write-Error "make clean failed for version $version" -ErrorAction Stop
              }
              Write-Output "Building version $version"
              Invoke-Expression "make -j8 PROTOCOL_VERSION=$version"
              if ($LASTEXITCODE -ne "0") {
                  Write-Error "make failed for version $version" -ErrorAction Stop
              }
              Rename-Item -Path "bin/fusion" -newName "$version-fusion"
              Write-Output "Built version $version"
          }
          Copy-Item -Path "sql" -Destination "bin/sql" -Recurse
          Copy-Item -Path "config.ini" -Destination "bin"
        shell: pwsh
      - name: Upload build artifact
        uses: actions/upload-artifact@v2
        with:
          name: 'ubuntu20_04-bin-x64-${{ env.SHORT_SHA }}'
          path: bin

  windows-build:
    runs-on: windows-2019
    steps:
      - name: Set environment
        run: $s = $env:GITHUB_SHA.subString(0, 7); echo "SHORT_SHA=$s" >> $env:GITHUB_ENV
        shell: pwsh
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          fetch-depth: 0
      - name: Check compilation
        run: |
          $versions = "104", "728", "1013"
          $configurations = "Release"
          # "Debug" builds are disabled, since we don't really need them

          $vsPath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise"

          Import-Module "$vsPath\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
          Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation

          Invoke-Expression "vcpkg install sqlite3:x64-windows"
          Invoke-Expression "vcpkg integrate install"

          foreach ($version in $versions) {
              if (Test-Path -LiteralPath "build") {
                  Remove-Item "build" -Recurse
                  Write-Output "Deleted existing build folder"
              }
              Invoke-Expression "cmake -B build -DPROTOCOL_VERSION=$version -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake"
              if ($LASTEXITCODE -ne "0") {
                  Write-Error "cmake generation failed for version $version" -ErrorAction Stop
              }
              Write-Output "Generated build files for version $version"

              foreach ($configuration in $configurations) {
                  Write-Output "Building version $version $configuration"
                  Invoke-Expression "msbuild build\OpenFusion.sln /maxcpucount:8 /p:BuildInParallel=true /p:CL_MPCount=8 /p:UseMultiToolTask=true /p:Configuration=$configuration"
                  if ($LASTEXITCODE -ne "0") {
                      Write-Error "msbuild build failed for version $version" -ErrorAction Stop
                  }
                  Rename-Item -Path "bin/$configuration" -newName "$version-$configuration"
                  Write-Output "Built version $version $configuration"
                  Copy-Item -Path "sql" -Destination "bin/$version-$configuration/sql" -Recurse
                  Copy-Item -Path "config.ini" -Destination "bin/$version-$configuration"
              }
          }
        shell: pwsh
      - name: Upload build artifact
        uses: actions/upload-artifact@v2
        with:
          name: 'windows-vs2019-bin-x64-${{ env.SHORT_SHA }}'
          path: bin

  copy-artifacts:
    if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    needs: [windows-build, ubuntu-build]
    env:
      BOT_SSH_KEY: ${{ secrets.BOT_SSH_KEY }}
      ENDPOINT: ${{ secrets.ENDPOINT }}
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          fetch-depth: 0
      - run: |
          GITDESC=$(git describe --tags)
          mkdir $GITDESC
          echo "ARTDIR=$GITDESC" >> $GITHUB_ENV
      - uses: actions/download-artifact@v3
        with:
          path: ${{ env.ARTDIR }}
      - name: Upload artifacts
        shell: bash
        run: |
          sudo apt install zip -y
          cd $ARTDIR
          for build in *; do
            cd $build
            zip -r ../$build.zip *
            cd ..
            rm -r $build
          done
          cd ..
          umask 077
          printf %s "$BOT_SSH_KEY" > cdn_key
          scp -i cdn_key -o StrictHostKeyChecking=no -r $ARTDIR $ENDPOINT
