name: Main
on:
  push:
    branches:
      - "feature/update**"
      - "feature/server_esm**"
    paths-ignore:
      - "docs/**"
      - ".github/workflows/main-docker.yml"
  workflow_dispatch:    

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  make-electron:
    name: Make Electron
    strategy:
      fail-fast: false
      matrix:
        arch: [x64, arm64]
        os:
          - name: macos
            image: macos-latest
            extension: dmg
          - name: linux
            image: ubuntu-latest
            extension: deb
          - name: windows
            image: windows-latest
            extension: exe
    runs-on: ${{ matrix.os.image }}
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Set up Python for appdmg to be installed
        if: ${{ matrix.os.name == 'macos' }}
        run: brew install python-setuptools
      - name: Install dependencies
        run: npm ci
      - name: Update build info
        run: npm run update-build-info      
      - name: Run electron-forge
        run: npm run make-electron -- --arch=${{ matrix.arch }}
      - name: Prepare artifacts (Unix)
        if: runner.os != 'windows'
        run: |
          mkdir -p upload
          file=$(find out/make -name '*.zip' -print -quit)
          cp "$file" "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.zip"
          file=$(find out/make -name '*.${{ matrix.os.extension }}' -print -quit)
          cp "$file" "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.${{ matrix.os.extension }}"
      - name: Prepare artifacts (Windows)
        if: runner.os == 'windows'
        run: |
          mkdir upload
          $file = Get-ChildItem -Path out/make -Filter '*.zip' -Recurse | Select-Object -First 1
          Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.zip"
          $file = Get-ChildItem -Path out/make -Filter '*.${{ matrix.os.extension }}' -Recurse | Select-Object -First 1
          Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.${{ matrix.os.extension }}"
      - name: Publish artifacts
        uses: actions/upload-artifact@v4
        with:
          name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}.zip
          path: upload/*.zip
      - name: Publish installer artifacts
        uses: actions/upload-artifact@v4
        with:
          name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}.${{matrix.os.extension}}
          path: upload/*.${{ matrix.os.extension }}
  build_linux_server:
    name: Build Linux Server
    strategy:
      fail-fast: false
      matrix:
        arch: [x64, arm64]
        include:
          - arch: x64
            runs-on: ubuntu-latest
          - arch: arm64
            runs-on: ubuntu-24.04-arm
    runs-on: ${{ matrix.runs-on }}
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - name: Install dependencies
        run: npm ci
      - name: Run Linux server build
        env:
          MATRIX_ARCH: ${{ matrix.arch }}
        run: |
          npm run update-build-info
          ./bin/build-server.sh
      - name: Prepare artifacts
        run: |
          mkdir -p upload
          file=$(find dist -name '*.tar.xz' -print -quit)
          cp "$file" "upload/TriliumNextNotes-linux-${{ matrix.arch }}-${{ github.ref_name }}.tar.xz"
      - uses: actions/upload-artifact@v4
        with:
          name: TriliumNextNotes linux server ${{ matrix.arch }}
          path: upload/TriliumNextNotes-linux-${{ matrix.arch }}-${{ github.ref_name }}.tar.xz
