on:
  push:
    paths-ignore:
      - "documentation/**"
    branches:
      - main
  pull_request:
    paths-ignore:
      - "documentation/**"
    branches:
      - main
  workflow_dispatch:

name: CI

jobs:
  rust-format:
    name: Check Rust Code Format
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable

      - name: Run cargo fmt
        run: cargo fmt --check

  rust-build-and-test:
    name: Build and Test Rust Project
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Install Dependencies
        run: |
          sudo apt update -y
          sudo apt install -y libdbus-1-dev gnome-keyring libxcb1-dev

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable

      - name: Cache Cargo Registry
        uses: actions/cache@v3
        with:
          path: ~/.cargo/registry
          key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-registry-

      - name: Cache Cargo Index
        uses: actions/cache@v3
        with:
          path: ~/.cargo/index
          key: ${{ runner.os }}-cargo-index
          restore-keys: |
            ${{ runner.os }}-cargo-index

      - name: Cache Cargo Build
        uses: actions/cache@v3
        with:
          path: target
          key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-build-

      - name: Build and Test
        run: |
          gnome-keyring-daemon --components=secrets --daemonize --unlock <<< 'foobar'
          cargo test
        working-directory: crates

      - name: Lint
        run: cargo clippy -- -D warnings

  desktop-lint:
    name: Lint Electron Desktop App
    runs-on: macos-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "lts/*"

      - name: Install Dependencies
        run: npm ci
        working-directory: ui/desktop

      - name: Run Lint
        run: npm run lint:check
        working-directory: ui/desktop

  # Faster Desktop App build for PRs only
  bundle-desktop-unsigned:
    uses: ./.github/workflows/bundle-desktop.yml
    if: github.event_name == 'pull_request'
    with:
      signing: false
