name: release

on:
  push:
    tags:
      - '*'

jobs:
  create-release:
    runs-on: ubuntu-latest
    env:
      RELEASE_NOTES_PATH: /tmp/release_notes
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Build release notes
        run: |
          touch ${{ env.RELEASE_NOTES_PATH }}
          cat CHANGELOG.md | sed -e '/./{H;$!d;}' -e "x;/##\ Version\ ${{ github.ref_name }}/"'!d;' >> ${{ env.RELEASE_NOTES_PATH }}

      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body_path: ${{ env.RELEASE_NOTES_PATH }}

  build-linux-x86:
    runs-on: ubuntu-latest
    needs: create-release
    env:
      LINUX_APP_RELEASE_PATH: frontend/app_flowy/product/${{ github.ref_name }}/linux/Release
      LINUX_ZIP_NAME: AppFlowy-linux-x86.tar.gz
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup environment - Rust and Cargo
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 'stable-2022-01-20'

      - name: Setup environment - Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
          flutter-version: '3.0.0'

      - name: Pre build
        working-directory: frontend
        run: |
          sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
          sudo apt-get update
          sudo apt-get install -y build-essential libsqlite3-dev libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev
          source $HOME/.cargo/env
          cargo install --force cargo-make
          cargo install --force duckscript_cli
          cargo make flowy_dev

      - name: Build Linux app
        working-directory: frontend
        run: |
          flutter config --enable-linux-desktop
          cargo make --env APP_VERSION=${{ github.ref_name }} --profile production-linux-x86 appflowy

      - name: Upload Release Asset
        id: upload-release-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_ZIP_NAME }}
          asset_name: ${{ env.LINUX_ZIP_NAME }}
          asset_content_type: application/octet-stream

  build-macos-x86_64:
    runs-on: macos-latest
    needs: create-release
    env:
      MACOS_APP_RELEASE_PATH: frontend/app_flowy/product/${{ github.ref_name }}/macos/Release
      MACOS_X86_ZIP_NAME: Appflowy-macos-x86_64.zip
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup environment - Rust and Cargo
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 'stable-2022-01-20'

      - name: Setup environment - Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
          flutter-version: '3.0.0'

      - name: Pre build
        working-directory: frontend
        run: |
          source $HOME/.cargo/env
          cargo install --force cargo-make
          cargo install --force duckscript_cli
          cargo make flowy_dev

      - name: Build macOS app for x86_64
        working-directory: frontend
        run: |
          flutter config --enable-macos-desktop
          cargo make --env APP_VERSION=${{ github.ref_name }} --profile production-mac-x86_64 appflowy

      - name: Archive macOS app
        working-directory: ${{ env.MACOS_APP_RELEASE_PATH }}
        run: zip -qr ${{ env.MACOS_X86_ZIP_NAME }} AppFlowy.app

      - name: Upload Release Asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_X86_ZIP_NAME }}
          asset_name: ${{ env.MACOS_X86_ZIP_NAME }}
          asset_content_type: application/octet-stream
