name: Hyperion CI Build
on:
  push:
    branches-ignore:
      - 'gh-pages'
      - 'docker-ci'
    tags:
      - '*'

jobs:

######################
###### Linux #########
######################

  Linux:
    name: ${{ matrix.dockerName }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        dockerImage: [ x86_64, armv6l, armv7l, aarch64 ]
        include:
          - dockerImage: x86_64
            dockerName: Debian Stretch (x86_64)
            platform: x11
          - dockerImage: armv6l
            dockerName: Debian Stretch (Raspberry Pi v1 & ZERO)
            platform: rpi
          - dockerImage: armv7l
            dockerName: Debian Stretch (Raspberry Pi 2 & 3)
            platform: rpi
          - dockerImage: aarch64
            dockerName: Debian Stretch (Generic AARCH64)
            platform: amlogic

    steps:
      - uses: actions/checkout@v1
        with:
          submodules: true

      # build process
      - name: Build packages
        env:
          DOCKER_IMAGE: ${{ matrix.dockerImage }}
          DOCKER_TAG: stretch
          DOCKER_NAME: ${{ matrix.dockerName }}
          PLATFORM: ${{ matrix.platform }}
        shell: bash
        run: ./.ci/ci_build.sh

      # upload artifacts (only on tagged commit)
      - name: Upload artifacts
        if: startsWith(github.event.ref, 'refs/tags')
        uses: actions/upload-artifact@v2
        with:
          path: deploy/Hyperion-*

######################
###### macOS #########
######################

  macOS:
    name: macOS
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v1
        with:
          submodules: true

      # install dependencies
      - name: Install dependencies
        shell: bash
        run: ./.ci/ci_install.sh

      # build process
      - name: Build packages
        env:
          PLATFORM: osx
        shell: bash
        run: ./.ci/ci_build.sh

      # upload artifacts (only on tagged commit)
      - name: Upload artifacts
        if: startsWith(github.event.ref, 'refs/tags')
        uses: actions/upload-artifact@v2
        with:
          path: build/Hyperion-*

######################
###### Windows #######
######################

  windows:
    name: Windows
    runs-on: windows-latest
    env:
      VCINSTALLDIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC'
      QT_VERSION: 5.15.0
    steps:
      - name: Checkout
        uses: actions/checkout@v1
        with:
          submodules: true

      - name: Cache Qt
        uses: actions/cache@v2
        id: cache-qt-windows
        with:
          path: ${{ runner.workspace }}/Qt
          key: ${{ runner.os }}-Qt.${{ env.QT_VERSION }}

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: ${{ env.QT_VERSION }}
          target: 'desktop'
          arch: 'win64_msvc2019_64'
          cached: ${{ steps.cache-qt-windows.outputs.cache-hit }}

      - name: Cache Chocolatey downloads
        uses: actions/cache@v2
        with:
          path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
          key: ${{ runner.os }}-chocolatey

      - name: Install Python, NSIS, OpenSSL
        shell: powershell
        run: |
          choco install --no-progress python nsis openssl -y

      - name: Install libjpeg-turbo
        run: |
          Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6-vc64.exe -OutFile libjpeg-turbo.exe
          .\libjpeg-turbo /S

      - name: Set up x64 build architecture environment
        shell: cmd
        run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"

      # Build packages
      - name: Build packages
        env:
          PLATFORM: windows
        shell: bash
        run: ./.ci/ci_build.sh

      # upload artifacts (only on tagged commit)
      - name: Upload artifacts
        if: startsWith(github.event.ref, 'refs/tags')
        uses: actions/upload-artifact@v2
        with:
          path: build/Hyperion-*

######################
#### Documentation ###
######################

  Docs:
    name: Documentation
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: docs
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # Install dependencies
      - name: Setup node 12
        uses: actions/setup-node@v1
        with:
          node-version: '12'

      # Build Docs
      - name: Build docs
        run: |
          cd docs
          npm install -g yarn
          yarn install
          yarn docs:build

      # Deploy to gh-pages (only on tagged commit)
      - name: Deploy to gh-pages
        if: startsWith(github.event.ref, 'refs/tags')
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docs/dist
          cname: docs.hyperion-project.org

################################
###### Publish Releases ########
################################

  publish:
    name: Publish Releases
    if: startsWith(github.event.ref, 'refs/tags')
    needs: [Linux, macOS, windows, Docs]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # generate environment variables
      - name: Generate environment variables from version and tag
        run: |
          echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
          echo "VERSION=$(tr -d '\n' < version)" >> $GITHUB_ENV
          echo "preRelease=false" >> $GITHUB_ENV

      # If version contains alpha or beta, mark draft release as pre-release
      - name: Mark release as pre-release
        if: contains(env.VERSION, 'alpha') || contains(env.VERSION, 'beta')
        run: echo "preRelease=true" >> $GITHUB_ENV

      # Download artifacts from previous build process
      - name: Download artifacts
        uses: actions/download-artifact@v2
        with:
          path: artifacts

      # create draft release and upload artifacts
      - name: Create draft release
        uses: softprops/action-gh-release@v1
        with:
          name: Hyperion ${{ env.VERSION }}
          tag_name: ${{ env.TAG }}
          files: "artifacts/**"
          draft: true
          prerelease: ${{ env.preRelease }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}