name: Meson CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    name: ${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }}

    strategy:
      fail-fast: false
      matrix:
        config:
          - name: Windows MSVC Release
            os: windows-latest
            msvc: true
            buildtype: release
            args: >-
              -Ddefault_library=static 
              --force-fallback-for=zlib,harfbuzz,freetype2,fribidi,libpng 
              -Dfreetype2:harfbuzz=disabled 
              -Dharfbuzz:freetype=disabled 
              -Dharfbuzz:cairo=disabled 
              -Dharfbuzz:glib=disabled 
              -Dharfbuzz:gobject=disabled
              -Dharfbuzz:tests=disabled
              -Dharfbuzz:docs=disabled
              -Dfribidi:tests=false
              -Dfribidi:docs=false
              -Dlibass:fontconfig=disabled
          #- {
          #  name: Windows MinGW,
          #  os: windows-latest,
          #  msvc: false
          #}
          - {
            name: Ubuntu Debug,
            os: ubuntu-latest,
            buildtype: debugoptimized,
            args: ''
          }
          - {
            name: Ubuntu Release,
            os: ubuntu-latest,
            buildtype: release,
            args: ''
          }
          - {
            name: macOS Debug,
            os: macos-latest,
            buildtype: debugoptimized,
            args: -Ddefault_library=static -Dbuild_osx_bundle=true -Dlocal_boost=true
          }
          - {
            name: macOS Release,
            os: macos-latest,
            buildtype: release,
            args: -Ddefault_library=static -Dbuild_osx_bundle=true -Dlocal_boost=true
          }

    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'

      - uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Setup Meson
        run: |
          python -m pip install --upgrade pip
          pip install meson

      - name: Setup MSVC
        if: matrix.config.os == 'windows-latest' && matrix.config.msvc == true
        uses: ilammy/msvc-dev-cmd@v1

      - name: Install dependencies (Windows)
        if: matrix.config.os == 'windows-latest'
        run: |
          choco install ninja innosetup
          $url = "https://github.com/leafo/moonscript/releases/download/win32-v0.5.0/moonscript-187bac54ee5a7450013e9c38e005a0e671b76f45.zip"
          mkdir moonscript
          Invoke-WebRequest -Uri $url -OutFile ".\moonscript\moonscript.zip"
          cd moonscript
          7z e moonscript.zip
          Get-Location | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

      - name: Install dependencies (MacOS)
        if: matrix.config.os == 'macos-latest'
        run: |
          brew update
          brew install luarocks ninja
          luarocks install luafilesystem 1.8.0
          luarocks install moonscript --dev
          brew install libass zlib ffms2 fftw hunspell
          brew install pulseaudio  # NO OpenAL in github CI

      - name: Install dependencies (Linux)
        if: matrix.config.os == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install ninja-build build-essential libx11-dev libwxgtk3.0-gtk3-dev libfreetype6-dev pkg-config libfontconfig1-dev libass-dev libasound2-dev libffms2-dev intltool libboost-all-dev

      - name: Configure
        run: meson build ${{ matrix.config.args }} -Dbuildtype=${{ matrix.config.buildtype }}

      - name: Build
        run: meson compile -C build
      
      - name: Run test
        run: meson test -C build --verbose "gtest main"

      # Windows artifacts
      - name: Generate Windows installer
        if: matrix.config.os == 'windows-latest'
        run: meson compile win-installer -C build

      - name: Generate Windows portable installer
        if: matrix.config.os == 'windows-latest'
        run: cd build && ninja win-portable

      - name: Upload artifacts - win_installer
        uses: actions/upload-artifact@v2
        if: matrix.config.os == 'windows-latest'
        with:
          name: ${{ matrix.config.name }} - installer
          path: build/Aegisub-*.exe
      
      - name: Upload artifacts - portable.zip
        uses: actions/upload-artifact@v2
        if: matrix.config.os == 'windows-latest'
        with:
          name: ${{ matrix.config.name }} - portable
          path: build/aegisub-portable-64.zip
      
      # macOS artifacts
      - name: Generate macOS installer
        if: matrix.config.os == 'macos-latest'
        run: |
          meson compile osx-bundle -C build
          meson compile osx-build-dmg -C build

      - name: Upload artifacts - macOS dmg
        uses: actions/upload-artifact@v2
        if: matrix.config.os == 'macos-latest'
        with:
          name: ${{ matrix.config.name }} - installer
          path: build/Aegisub-*.dmg
