name: Release

on:
  create:
    tags:
      - 'v*' # Version tag
  workflow_dispatch:

env:
  CARGO_TERM_COLOR: always

jobs:

  publish:
    name: publish to crates.io
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: Swatinem/rust-cache@v1.0.1
      - name: Publish crate
        continue-on-error: true
        run: cargo publish --manifest-path kalk/Cargo.toml --token ${{ secrets.CARGO_REGISTRY_TOKEN }} --verbose
      - name: Publish CLI
        run: sleep 20 && cargo publish --manifest-path cli/Cargo.toml --token ${{ secrets.CARGO_REGISTRY_TOKEN }} --verbose

  publish_npm:
    name: publish to npm
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: Swatinem/rust-cache@v1.0.1
      - uses: actions/setup-node@v1
        with:
          node-version: 14
          registry-url: https://registry.npmjs.org/
      - name: Install wasm-pack
        run: cargo install --git https://github.com/rustwasm/wasm-pack.git --rev d46d1c69b788956160deed5e4e603f4f2780ffcf
      - name: Build
        run: |
          yarn install
          cd kalk
          wasm-pack build --scope paddim8 -- --no-default-features
          cd ..
      - uses: JS-DevTools/npm-publish@v1
        with:
          token: ${{ secrets.NPM_TOKEN }}
          package: ./kalk/pkg/package.json
          access: public

  publish_kalk_web:
    name: publish kalk_web
    if: always()
    runs-on: ubuntu-latest
    needs: [publish_npm]
    steps:
      - uses: actions/checkout@master
      - uses: actions/setup-node@v1
        with:
          node-version: 14
          registry-url: https://registry.npmjs.org/
      - name: build
        run: |
          cd web
          npm install
          cd ..
      - uses: JS-DevTools/npm-publish@v1
        with:
          token: ${{ secrets.NPM_TOKEN }}
          package: ./web/package.json
          access: public

  release_linux:
    name: release linux
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: Swatinem/rust-cache@v1.0.1
      - name: Compile
        run: |
          cargo build --release --verbose
          cp target/release/kalker target/release/kalker-linux
      - uses: actions/upload-artifact@v2
        with:
          name: binaries
          path: target/release/kalker-linux

  release_mac:
    name: release mac
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@master
      - uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry/index
            ~/.cargo/registry/cache
            target
          key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
      - name: Compile
        run: |
          cargo build --release --verbose
          zip -r kalker-macOS.zip target/release/kalker
      - uses: actions/upload-artifact@v2
        with:
          name: binaries
          path: kalker-macOS.zip

  release_windows:
    name: release windows
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@master
      - uses: actions/cache@v2
        with:
          key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
          path: |
            C:\Users\runneradmin\.cargo\bin\cargo-wix
            C:\Users\runneradmin\.cargo\registry\index
            C:\Users\runneradmin\.cargo\registry\cache
            C:\Users\runneradmin\.cargo\registry\cache
            {FOLDERID_LocalAppData}\gmp-mpfr-sys
            D:\a\kalker\kalker\target
            C:\msys64\home\paddi\kalker\target
      - uses: msys2/setup-msys2@v2
        with:
          update: true
          install: >-
            base-devel
            pacman-mirrors
            diffutils
            m4
            make
            mingw-w64-x86_64-gcc
            mingw-w64-x86_64-rust
        continue-on-error: true
      - shell: msys2 {0}
        run: |
          cargo build --release --verbose

      - uses: crazy-max/ghaction-chocolatey@v1
        with:
          args: install wixtoolset -y
      - shell: msys2 {0}
        run: |
          [ ! -f /c/Users/runneradmin/.cargo/bin/cargo-wix.exe ] && cargo install cargo-wix --version 0.3.1
          cd cli
          cargo wix --no-build --nocapture
          mv target/wix/*.msi target/wix/kalker-windows.msi
      - uses: actions/upload-artifact@v2
        with:
          name: binaries
          path: cli/target/wix/kalker-windows.msi

  release_android:
    name: release android
    if: always()
    runs-on: ubuntu-latest
    needs: [publish_kalk_web]
    defaults:
      run:
        working-directory: ./mobile

    steps:
      - uses: actions/checkout@master
      - uses: actions/cache@v2
        with:
          path: |
            mobile/android/.gradle
            mobile/android/build
            mobile/android/app/build
          key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
      - name: npm
        run: |
          npm install
          npm run build
      - name: build app
        run: |
          npx cap sync
          cd android
          version=$(cat ../../web/package.json | grep version | head -1  | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]')
          APP_VERSION_NAME=$version ./gradlew assembleRelease
      - uses: r0adkll/sign-android-release@v1
        name: sign apk
        with:
          releaseDirectory: mobile/android/app/build/outputs/apk/release
          signingKeyBase64: ${{ secrets.SIGNING_KEY }}
          alias: ${{ secrets.ALIAS }}
          keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
          keyPassword: ${{ secrets.KEY_PASSWORD }}
      - run: mv $(ls -Art android/app/build/outputs/apk/release/*.apk | tail -n 1) ../kalker-android.apk
      - uses: actions/upload-artifact@v2
        with:
          name: binaries
          path: kalker-android.apk

  create_release:
    name: Create Release
    if: always()
    needs: [release_linux, release_mac, release_windows, release_android]
    runs-on: ubuntu-latest
    steps:
    - name: Create Release
      id: create_release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ github.ref }}
        release_name: ${{ github.ref }}
        draft: false
        prerelease: false
    - name: Download Artifact
      uses: actions/download-artifact@v2
      with:
        name: binaries
    - name: Upload Assets
      uses: softprops/action-gh-release@v1
      with:
        files: ./*
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}