name: Build GUI

on:
  push:
    branches:
      - main
    paths:
      - .github/workflows/build-gui.yml
      - gui/**
      - package*.json
  pull_request:
    paths:
      - .github/workflows/build-gui.yml
      - gui/**
      - package*.json
  workflow_dispatch:
  create:

jobs:
  lint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive

      - uses: pnpm/action-setup@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version-file: '.node-version'
          cache: 'pnpm'

      - name: Build
        run: |
          pnpm i
          cd gui
          pnpm run lint

  build:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-22.04, windows-latest, macos-latest]

    runs-on: ${{ matrix.os }}

    env:
      # Don't mark warnings as errors
      CI: false

    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive

      - if: matrix.os == 'ubuntu-22.04'
        name: Set up Linux dependencies
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf
          # Increment to invalidate the cache
          version: 1.0
          # Enables a workaround to attempt to run pre and post install scripts
          execute_install_scripts: true
          # Disables uploading logs as a build artifact
          debug: false

      - name: Cache cargo dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: "${{ matrix.os }}"

      - uses: pnpm/action-setup@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version-file: '.node-version'
          cache: 'pnpm'

      - name: Build
        shell: bash
        run: |
          pnpm i
          pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )

      - if: matrix.os == 'windows-latest'
        name: Upload a Build Artifact (Windows)
        uses: actions/upload-artifact@v4
        with:
          # Artifact name
          name: SlimeVR-GUI-Windows
          # A file, directory or wildcard pattern that describes what to upload
          path: target/release/slimevr.exe

      - if: matrix.os == 'ubuntu-22.04'
        name: Upload a Build Artifact (Linux)
        uses: actions/upload-artifact@v4
        with:
          # Artifact name
          name: SlimeVR-GUI-Linux
          # A file, directory or wildcard pattern that describes what to upload
          path: target/release/slimevr

      - if: matrix.os == 'macos-latest'
        name: Upload a Build Artifact (macOS)
        uses: actions/upload-artifact@v4
        with:
          # Artifact name
          name: SlimeVR-GUI-macOS
          # A file, directory or wildcard pattern that describes what to upload
          path: target/release/slimevr
