---
name: Build

on:
  push:
    paths-ignore:
      - 'docs/**'
      - '*.md'
  pull_request:
    paths-ignore:
      - 'docs/**'
      - '*.md'

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [windows-latest, ubuntu-latest, macos-latest]
      fail-fast: false

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

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

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          mirror: 'http://mirrors.ocf.berkeley.edu/qt/'
          cached: ${{ steps.cache-qt.outputs.cache-hit }}

      # WINDOWS
      - name: Cache conan
        if: startsWith(matrix.os, 'windows')
        uses: actions/cache@v1
        with:
          key: ${{ runner.os }}-conan-root-${{ hashFiles('**/conanfile.txt') }}
          path: ~/.conan

      - name: Cache conan packages
        if: startsWith(matrix.os, 'windows')
        uses: actions/cache@v1
        with:
          key: ${{ runner.os }}-conan-pkg-${{ hashFiles('**/conanfile.txt') }}
          path: C:/.conan/

      - name: Install dependencies (Windows)
        if: startsWith(matrix.os, 'windows')
        run: |
            choco install conan -y

            refreshenv
        shell: cmd

      - name: Build (Windows)
        if: startsWith(matrix.os, 'windows')
        run: |
            call "%programfiles(x86)%\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
            mkdir build
            cd build
            "C:\Program Files\Conan\conan\conan.exe" install ..
            qmake ..
            set cl=/MP
            nmake /S /NOLOGO
            windeployqt release/chatterino.exe --release --no-compiler-runtime --no-translations --no-opengl-sw --dir Chatterino2/
            cp release/chatterino.exe Chatterino2/
            echo nightly > Chatterino2/modes
            7z a chatterino-windows-x86-64.zip Chatterino2/
        shell: cmd

      - name: Upload artifact (Windows)
        if: startsWith(matrix.os, 'windows')
        uses: actions/upload-artifact@v1
        with:
          name: chatterino-windows-x86-64.zip
          path: build/chatterino-windows-x86-64.zip

      # LINUX
      - name: Install dependencies (Ubuntu)
        if: startsWith(matrix.os, 'ubuntu')
        run: sudo apt-get update && sudo apt-get -y install libssl-dev libboost-dev libboost-system-dev libboost-filesystem-dev libpulse-dev libxkbcommon-x11-0 libgstreamer-plugins-base1.0-0 build-essential libgl1-mesa-dev

      - name: Build (Ubuntu)
        if: startsWith(matrix.os, 'ubuntu')
        run: |
            mkdir build
            cd build
            qmake PREFIX=/usr ..
            make -j8
        shell: bash

      - name: Package (Ubuntu)
        if: startsWith(matrix.os, 'ubuntu')
        run: |
            cd build
            sh ./../.CI/CreateAppImage.sh
        shell: bash

      - name: Upload artifact (Ubuntu)
        if: startsWith(matrix.os, 'ubuntu')
        uses: actions/upload-artifact@v1
        with:
          name: Chatterino-x86_64.AppImage
          path: build/Chatterino-x86_64.AppImage

      # MACOS
      - name: Install dependencies (MacOS)
        if: startsWith(matrix.os, 'macos')
        run: |
            brew install boost openssl rapidjson qt p7zip create-dmg
        shell: bash

      - name: Build (MacOS)
        if: startsWith(matrix.os, 'macos')
        run: |
            mkdir build
            cd build
            /usr/local/opt/qt/bin/qmake .. DEFINES+=$dateOfBuild
            sed -ie 's/-framework\\\ /-framework /g' Makefile
            make -j8
        shell: bash

      - name: Package (MacOS)
        if: startsWith(matrix.os, 'macos')
        run: |
            ls -la
            pwd
            ls -la build || true
            cd build
            sh ./../.CI/CreateDMG.sh
        shell: bash

      - name: Upload artifact (MacOS)
        if: startsWith(matrix.os, 'macos')
        uses: actions/upload-artifact@v1
        with:
          name: chatterino-osx.dmg
          path: build/chatterino-osx.dmg

  create-release:
    needs: build
    runs-on: ubuntu-latest
    if: (github.event_name == 'push' && github.ref == 'refs/heads/master')

    steps:
      - name: Create release
        id: create_release
        uses: pajlada/create-release@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: github-actions-nightly
          backup_tag_name: backup-github-actions-nightly
          release_name: GitHub Actions Nightly Test
          body: |
              1 ${{ github.eventName }}
              2 ${{ github.sha }}
              3 ${{ github.ref }}
              4 ${{ github.workflow }}
              5 ${{ github.action }}
              6 ${{ github.actor }}
          prerelease: true

      - uses: actions/download-artifact@v1
        with:
          name: chatterino-windows-x86-64.zip
          path: windows/

      - uses: actions/download-artifact@v1
        with:
          name: Chatterino-x86_64.AppImage
          path: linux/

      - uses: actions/download-artifact@v1
        with:
          name: chatterino-osx.dmg
          path: macos/

      # TODO: Extract dmg and appimage

      - name: TREE
        run: |
            sudo apt update && sudo apt install tree
            tree .

      # - name: Read upload URL into output
      #   id: upload_url
      #   run: |
      #     echo "::set-output name=upload_url::$(cat release-upload-url.txt/release-upload-url.txt)"

      - name: Upload release asset (Windows)
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./windows/chatterino-windows-x86-64.zip
          asset_name: chatterino-windows-x86-64.zip
          asset_content_type: application/zip

      - name: Upload release asset (Ubuntu)
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./linux/Chatterino-x86_64.AppImage
          asset_name: Chatterino-x86_64.AppImage
          asset_content_type: application/x-executable

      - name: Upload release asset (MacOS)
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./macos/chatterino-osx.dmg
          asset_name: chatterino-osx.dmg
          asset_content_type: application/x-bzip2