name: Nightly build
on:
  schedule:
    - cron: "0 0 * * *"
  workflow_dispatch:

jobs:
  linux:
    strategy:
      matrix:
        feature: [ "default", "arkzkey", "stateless" ]
        target:
          - x86_64-unknown-linux-gnu
          - aarch64-unknown-linux-gnu
          - i686-unknown-linux-gnu
        include:
          - feature: stateless
            cargo_args: --exclude rln-cli
    name: Linux build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install stable toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true
          target: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
      - name: Install dependencies
        run: make installdeps
      - name: cross build
        run: |
          cross build --release --target ${{ matrix.target }} --features ${{ matrix.feature }} --workspace --exclude rln-wasm ${{ matrix.cargo_args }}
          mkdir release
          cp target/${{ matrix.target }}/release/librln* release/
          tar -czvf ${{ matrix.target }}-${{ matrix.feature }}-rln.tar.gz release/

      - name: Upload archive artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.target }}-${{ matrix.feature }}-archive
          path: ${{ matrix.target }}-${{ matrix.feature }}-rln.tar.gz
          retention-days: 2

  macos:
    name: MacOS build
    runs-on: macos-latest
    strategy:
      matrix:
        feature: [ "default", "arkzkey", "stateless" ]
        target:
          - x86_64-apple-darwin
          - aarch64-apple-darwin
        include:
          - feature: stateless
            cargo_args: --exclude rln-cli
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install stable toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true
          target: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
      - name: Install dependencies
        run: make installdeps
      - name: cross build
        run: |
          cross build --release --target ${{ matrix.target }} --features ${{ matrix.feature }} --workspace --exclude rln-wasm ${{ matrix.cargo_args }}
          mkdir release
          cp target/${{ matrix.target }}/release/librln* release/
          tar -czvf ${{ matrix.target }}-${{ matrix.feature }}-rln.tar.gz release/

      - name: Upload archive artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.target }}-${{ matrix.feature }}-archive
          path: ${{ matrix.target }}-${{ matrix.feature }}-rln.tar.gz
          retention-days: 2

  browser-rln-wasm:
    name: Browser build (RLN WASM)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install stable toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          # TODO: Update to stable once wasmer supports it
          toolchain: 1.82.0
          override: true
      - uses: Swatinem/rust-cache@v2
      - name: Install dependencies
        run: make installdeps
      - name: Install wasm-pack
        uses: jetli/wasm-pack-action@v0.3.0
      - name: cross make build
        run: |
          cross make build
          mkdir release
          cp pkg/** release/
          tar -czvf browser-rln-wasm.tar.gz release/
        working-directory: rln-wasm

      - name: Upload archive artifact
        uses: actions/upload-artifact@v4
        with:
          name: browser-rln-wasm-archive
          path: rln-wasm/browser-rln-wasm.tar.gz
          retention-days: 2

  prepare-prerelease:
    name: Prepare pre-release
    needs: [ linux, macos, browser-rln-wasm ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          ref: master
      - name: Download artifacts
        uses: actions/download-artifact@v4

      - name: Delete tag
        uses: dev-drprasad/delete-tag-and-release@v0.2.1
        with:
          delete_release: true
          tag_name: nightly
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Create prerelease
        run: |
          start_tag=$(gh release list -L 2 --exclude-drafts | grep -v nightly | cut -d$'\t' -f3 | sed -n '1p')
          gh release create nightly --prerelease --target master \
            --title 'Nightly build ("master" branch)' \
            --generate-notes \
            --draft=false \
            --notes-start-tag $start_tag \
            *-archive/*.tar.gz \
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Delete artifacts
        uses: geekyeggo/delete-artifact@v5
        with:
          failOnError: false
          name: |
            *-archive
