name: Flutter CI

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - master
    tags:
      - '*'

jobs:
  build:
    name: ${{ matrix.job.target }} (${{ matrix.job.os }})
    runs-on: ${{ matrix.job.os }}
    strategy:
      fail-fast: false
      matrix:
        job:
          # - { target: aarch64-unknown-linux-gnu   , os: ubuntu-20.04, use-cross: true }
          # - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
          # - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
          # - { target: i686-pc-windows-msvc        , os: windows-2019                  }
          # - { target: i686-unknown-linux-gnu      , os: ubuntu-20.04, use-cross: true }
          # - { target: i686-unknown-linux-musl     , os: ubuntu-20.04, use-cross: true }
          # - { target: x86_64-apple-darwin         , os: macos-10.15                   }
          # - { target: x86_64-pc-windows-gnu       , os: windows-2019                  }
          # - { target: x86_64-pc-windows-msvc      , os: windows-2019                  }
          - { target: x86_64-unknown-linux-gnu    , os: ubuntu-20.04 }
          # - { target: x86_64-unknown-linux-musl   , os: ubuntu-20.04, use-cross: true }
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2

      - name: Install prerequisites
        shell: bash
        run: |
          case ${{ matrix.job.target }} in
            x86_64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake libclang-dev ninja-build libappindicator3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev;;
            # arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
            # aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
          esac

      - name: Install flutter
        uses: subosito/flutter-action@v2
        with:
          channel: 'stable'

      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: ${{ matrix.job.target }}
          override: true
          profile: minimal # minimal component installation (ie, no documentation)

      - uses: Swatinem/rust-cache@v1

      - name: Install flutter rust bridge deps
        run: |
          dart pub global activate ffigen --version 5.0.1
          # flutter_rust_bridge
          pushd /tmp && git clone https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge --depth=1 && popd
          pushd /tmp/flutter_rust_bridge/frb_codegen && cargo install --path . && popd
          pushd flutter && flutter pub get && popd
          ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart

      - name: Restore from cache and install vcpkg
        uses: lukka/run-vcpkg@v7
        with:
          setupOnly: true
          vcpkgGitCommitId: '1d4128f08e30cec31b94500840c7eca8ebc579cb'

      - name: Install vcpkg dependencies
        run: |
          $VCPKG_ROOT/vcpkg install libvpx libyuv opus
        shell: bash

      - name: Show version information (Rust, cargo, GCC)
        shell: bash
        run: |
          gcc --version || true
          rustup -V
          rustup toolchain list
          rustup default
          cargo -V
          rustc -V

      - name: Build rustdesk ffi lib
        run: cargo build --features flutter --lib

      - name: Build Flutter
        run: |
          pushd flutter
          flutter pub get
          flutter build linux --debug -v
          popd