name: CI

# env:
#   MIN_SUPPORTED_RUST_VERSION: "1.46.0"
#   CICD_INTERMEDIATES_DIR: "_cicd-intermediates"

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

jobs:
  # ensure_cargo_fmt:
  #   name: Ensure 'cargo fmt' has been run
  #   runs-on: ubuntu-20.04
  #   steps:
  #   - uses: actions-rs/toolchain@v1
  #     with:
  #       toolchain: stable
  #       default: true
  #       profile: minimal
  #       components: rustfmt
  #   - uses: actions/checkout@v2
  #   - run: cargo fmt -- --check

  # min_version:
  #   name: Minimum supported rust version
  #   runs-on: ubuntu-20.04
  #   steps:
  #   - name: Checkout source code
  #     uses: actions/checkout@v2

  #   - name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
  #     uses: actions-rs/toolchain@v1
  #     with:
  #       toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }}
  #       default: true
  #       profile: minimal # minimal component installation (ie, no documentation)
  #       components: clippy
  #   - name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
  #     uses: actions-rs/cargo@v1
  #     with:
  #       command: clippy
  #       args: --locked --all-targets --all-features -- --allow clippy::unknown_clippy_lints
  #   - name: Run tests
  #     uses: actions-rs/cargo@v1
  #     with:
  #       command: test
  #       args: --locked

  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)

    - 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: Install corrosion
      run: |
        mkdir /tmp/corrosion
        pushd /tmp/corrosion
        git clone https://github.com/corrosion-rs/corrosion.git
        # Optionally, specify -DCMAKE_INSTALL_PREFIX=<target-install-path>. You can install Corrosion anyway
        cmake -Scorrosion -Bbuild -DCMAKE_BUILD_TYPE=Release
        cmake --build build --config Release
        # This next step may require sudo or admin privileges if you're installing to a system location,
        # which is the default.
        sudo cmake --install build --config Release
        popd

    - 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

    - uses: Swatinem/rust-cache@v1
  
#    - name: Build
#      uses: actions-rs/cargo@v1
#      with:
#        use-cross: ${{ matrix.job.use-cross }}
#        command: build
#        args: --locked --release --target=${{ matrix.job.target }} --features flutter -v

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

    # - name: Strip debug information from executable
    #   id: strip
    #   shell: bash
    #   run: |
    #     # Figure out suffix of binary
    #     EXE_suffix=""
    #     case ${{ matrix.job.target }} in
    #       *-pc-windows-*) EXE_suffix=".exe" ;;
    #     esac;

    #     # Figure out what strip tool to use if any
    #     STRIP="strip"
    #     case ${{ matrix.job.target }} in
    #       arm-unknown-linux-*) STRIP="arm-linux-gnueabihf-strip" ;;
    #       aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
    #       *-pc-windows-msvc) STRIP="" ;;
    #     esac;

    #     # Setup paths
    #     BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/"
    #     mkdir -p "${BIN_DIR}"
    #     BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
    #     BIN_PATH="${BIN_DIR}/${BIN_NAME}"

    #     # Copy the release build binary to the result location
    #     cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}"

    #     # Also strip if possible
    #     if [ -n "${STRIP}" ]; then
    #       "${STRIP}" "${BIN_PATH}"
    #     fi

    #     # Let subsequent steps know where to find the (stripped) bin
    #     echo ::set-output name=BIN_PATH::${BIN_PATH}
    #     echo ::set-output name=BIN_NAME::${BIN_NAME}

    - name: Set testing options
      id: test-options
      shell: bash
      run: |
        # test only library unit tests and binary for arm-type targets
        unset CARGO_TEST_OPTIONS
        unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac;
        echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}

    - name: Build tests
      uses: actions-rs/cargo@v1
      with:
        use-cross: ${{ matrix.job.use-cross }}
        command: build
        args: --locked --tests --target=${{ matrix.job.target }}        

    # - name: Run tests
    #   uses: actions-rs/cargo@v1
    #   with:
    #     use-cross: ${{ matrix.job.use-cross }}
    #     command: test
    #     args: --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
