name: "node.js build"
on:
  pull_request:
  push:
    tags:
      - "*"
      - "!py-*"

jobs:
  prebuild:
    name: Prebuild
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false
      - uses: actions/setup-node@v4
        with:
          node-version: "18"
      - name: System info
        run: |
          rustc -vV
          rustup -vV
          cargo -vV
          npm --version
          node --version

      - name: Cache node modules
        uses: actions/cache@v4
        with:
          path: |
            ${{ env.APPDATA }}/npm-cache
            ~/.npm
          key: ${{ matrix.os }}-node-${{ hashFiles('**/package.json') }}

      - name: Cache cargo index
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git
            target
          key: ${{ matrix.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}-2

      - name: Install dependencies & build
        if: steps.cache.outputs.cache-hit != 'true'
        working-directory: node
        run: npm install --verbose

      - name: Build Prebuild
        working-directory: node
        run: |
          npm run prebuildify
          tar -zcvf "${{ matrix.os }}.tar.gz" -C prebuilds .

      - name: Upload Prebuild
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.os }}
          path: node/${{ matrix.os }}.tar.gz

  prebuild-linux:
    name: Prebuild Linux
    runs-on: ubuntu-latest

    # Build Linux prebuilds inside a container with old glibc for backwards compatibility.
    # Debian 10 contained glibc 2.28: https://packages.debian.org/buster/libc6
    container: debian:10
    steps:
      # Working directory is owned by 1001:1001 by default.
      # Change it to our user.
      - name: Change working directory owner
        run: chown root:root .

      - uses: actions/checkout@v4
        with:
          show-progress: false
      - uses: actions/setup-node@v4
        with:
          node-version: "18"
      - run: apt-get update

      # Python is needed for node-gyp
      - name: Install curl, python and compilers
        run: apt-get install -y curl build-essential python3
      - name: Install Rust
        run: |
          curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
      - name: System info
        run: |
          rustc -vV
          rustup -vV
          cargo -vV
          npm --version
          node --version

      - name: Cache node modules
        uses: actions/cache@v4
        with:
          path: |
            ${{ env.APPDATA }}/npm-cache
            ~/.npm
          key: ${{ matrix.os }}-node-${{ hashFiles('**/package.json') }}

      - name: Cache cargo index
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git
            target
          key: ${{ matrix.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}-2

      - name: Install dependencies & build
        if: steps.cache.outputs.cache-hit != 'true'
        working-directory: node
        run: npm install --verbose

      - name: Build Prebuild
        working-directory: node
        run: |
          npm run prebuildify
          tar -zcvf "linux.tar.gz" -C prebuilds .

      - name: Upload Prebuild
        uses: actions/upload-artifact@v4
        with:
          name: linux
          path: node/linux.tar.gz

  pack-module:
    needs: [prebuild, prebuild-linux]
    name: Package deltachat-node and upload to download.delta.chat
    runs-on: ubuntu-latest
    steps:
      - name: Install tree
        run: sudo apt install tree
      - uses: actions/checkout@v4
        with:
          show-progress: false
      - uses: actions/setup-node@v4
        with:
          node-version: "18"
      - name: Get tag
        id: tag
        uses: dawidd6/action-get-tag@v1
        continue-on-error: true
      - name: Get Pull Request ID
        id: prepare
        run: |
          tag=${{ steps.tag.outputs.tag }}
          if [ -z "$tag" ]; then
            node -e "console.log('DELTACHAT_NODE_TAR_GZ=deltachat-node-' + '${{ github.ref }}'.split('/')[2] + '.tar.gz')" >> $GITHUB_ENV
          else
            echo "DELTACHAT_NODE_TAR_GZ=deltachat-node-${{ steps.tag.outputs.tag }}.tar.gz" >> $GITHUB_ENV
            echo "No preview will be uploaded this time, but the $tag release"
          fi
      - name: System info
        run: |
          rustc -vV
          rustup -vV
          cargo -vV
          npm --version
          node --version
          echo $DELTACHAT_NODE_TAR_GZ
      - name: Download Linux prebuild
        uses: actions/download-artifact@v4
        with:
          name: linux
      - name: Download macOS prebuild
        uses: actions/download-artifact@v4
        with:
          name: macos-latest
      - name: Download Windows prebuild
        uses: actions/download-artifact@v4
        with:
          name: windows-latest
      - shell: bash
        run: |
          mkdir node/prebuilds
          tar -xvzf linux.tar.gz -C node/prebuilds
          tar -xvzf macos-latest.tar.gz -C node/prebuilds
          tar -xvzf windows-latest.tar.gz -C node/prebuilds
          tree node/prebuilds
          rm -f linux.tar.gz macos-latest.tar.gz windows-latest.tar.gz
      - name: Install dependencies without running scripts
        run: |
          npm install --ignore-scripts
      - name: Build constants
        run: |
          npm run build:core:constants
      - name: Build TypeScript part
        run: |
          npm run build:bindings:ts
      - name: Package
        shell: bash
        run: |
          mv node/README.md README.md
          npm pack .
          ls -lah
          mv $(find deltachat-node-*) $DELTACHAT_NODE_TAR_GZ
      - name: Upload prebuild
        uses: actions/upload-artifact@v4
        with:
          name: deltachat-node.tgz
          path: ${{ env.DELTACHAT_NODE_TAR_GZ }}
      # Upload to download.delta.chat/node/preview/
      - name: Upload deltachat-node preview to download.delta.chat/node/preview/
        if: ${{ ! steps.tag.outputs.tag }}
        id: upload-preview
        shell: bash
        run: |
          echo -e "${{ secrets.SSH_KEY }}" >__TEMP_INPUT_KEY_FILE
          chmod 600 __TEMP_INPUT_KEY_FILE
          scp -o StrictHostKeyChecking=no -v -i __TEMP_INPUT_KEY_FILE -P "22" -r $DELTACHAT_NODE_TAR_GZ "${{ secrets.USERNAME }}"@"download.delta.chat":"/var/www/html/download/node/preview/"
        continue-on-error: true
      - name: Post links to details
        if: steps.upload-preview.outcome == 'success'
        run: node ./node/scripts/postLinksToDetails.js
        env:
          URL: preview/${{ env.DELTACHAT_NODE_TAR_GZ }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      # Upload to download.delta.chat/node/
      - name: Upload deltachat-node build to download.delta.chat/node/
        if: ${{ steps.tag.outputs.tag }}
        id: upload
        shell: bash
        run: |
          echo -e "${{ secrets.SSH_KEY }}" >__TEMP_INPUT_KEY_FILE
          chmod 600 __TEMP_INPUT_KEY_FILE
          scp -o StrictHostKeyChecking=no -v -i __TEMP_INPUT_KEY_FILE -P "22" -r $DELTACHAT_NODE_TAR_GZ "${{ secrets.USERNAME }}"@"download.delta.chat":"/var/www/html/download/node/"
