name: Flutter Nightly Build

on:
  schedule:
    # schedule build every night
    - cron: "0 0 * * *"
  workflow_dispatch:

env:
  LLVM_VERSION: "10.0"
  FLUTTER_VERSION: "3.0.5"
  TAG_NAME: "nightly"
  VCPKG_COMMIT_ID: '6ca56aeb457f033d344a7106cb3f9f1abf8f4e98'

jobs:
  build-for-windows:
    name: ${{ matrix.job.target }} (${{ matrix.job.os }})
    runs-on: ${{ matrix.job.os }}
    strategy:
      fail-fast: false
      matrix:
        job:
          # - { target: i686-pc-windows-msvc        , os: windows-2019                  }
          # - { target: x86_64-pc-windows-gnu       , os: windows-2019                  }
          - { target: x86_64-pc-windows-msvc      , os: windows-2019 }
    steps:
      - name: Checkout source code
        uses: actions/checkout@v3

      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@v1
        with:
          version: ${{ env.LLVM_VERSION }}

      - name: Install flutter
        uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
          flutter-version: ${{ env.FLUTTER_VERSION }}

      - 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@v2
        with:
          prefix-key: ${{ matrix.job.os }}

      - name: Install flutter rust bridge deps
        run: |
          dart pub global activate ffigen --version 5.0.1
          $exists = Test-Path ~/.cargo/bin/flutter_rust_bridge_codegen.exe
          Push-Location ..
          git clone https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge --depth=1
          Push-Location flutter_rust_bridge/frb_codegen ; cargo install --path . ; Pop-Location
          Pop-Location
          Push-Location flutter ; flutter pub get ; Pop-Location
          ~/.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: ${{ env.VCPKG_COMMIT_ID }}

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

      - name: Build rustdesk
        run: python3 .\build.py --portable --hwcodec --flutter

      - name: Rename rustdesk
        shell: bash
        run: |
          for name in rustdesk*??-install.exe; do
              mv "$name" "${name%%-install.exe}-${{ matrix.job.target }}.exe"
          done

      - name: Publish Release
        uses: softprops/action-gh-release@v1
        with:
          prerelease: true
          tag_name: ${{ env.TAG_NAME }}
          files: |
            rustdesk-*.exe

  build-for-linux:
    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-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-unknown-linux-gnu    , os: ubuntu-18.04}
          # - { target: x86_64-unknown-linux-musl   , os: ubuntu-20.04, use-cross: true }
    steps:
      - name: Checkout source code
        uses: actions/checkout@v3

      - name: Install prerequisites
        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 libayatana-appindicator3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libvdpau-dev libva-dev libclang-dev llvm-dev libclang-10-dev llvm-10-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'
          flutter-version: ${{ env.FLUTTER_VERSION }}

      - 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@v2
        with:
          prefix-key: ${{ matrix.job.os }}

      - name: Install flutter rust bridge deps
        shell: bash
        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: ${{ env.VCPKG_COMMIT_ID }}

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

      - name: Install cargo bundle tools
        run: |
          cargo install cargo-bundle --force

      - 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
        run: ./build.py --flutter --hwcodec

      - name: Rename rustdesk
        shell: bash
        run: |
          for name in rustdesk*??.deb; do
              mv "$name" "${name%%.deb}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb"
          done

      - name: Publish debian package
        uses: softprops/action-gh-release@v1
        with:
          prerelease: true
          tag_name: ${{ env.TAG_NAME }}
          files: |
            rustdesk*.deb

      - name: Build archlinux package
        uses: vufa/arch-makepkg-action@master
        with:
          packages: >
            llvm
            clang
            libva
            libvdpau
            rust
            gstreamer
            unzip
            git
            cmake
            gcc
            curl
            wget
            yasm
            nasm
            zip
            make
            pkg-config
            clang
            gtk3
            xdotool
            libxcb
            libxfixes
            alsa-lib
            pipewire
            python
            ttf-arphic-uming
            libappindicator-gtk3
            libayatana-appindicator
          scripts: |
            cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f

      - name: Publish archlinux package
        uses: softprops/action-gh-release@v1
        with:
          prerelease: true
          tag_name: ${{ env.TAG_NAME }}
          files: |
            res/rustdesk*.zst
