name: '🏗️ Build and Test JellyTau'

on:
  push:
    branches:
      - master
    paths-ignore:
      - '**/*.md'
  pull_request:
    branches:
      - master
    paths-ignore:
      - '**/*.md'
  workflow_dispatch:

jobs:
  test:
    name: Run Tests
    runs-on: linux/amd64
    container:
      image: gitea.tourolle.paris/dtourolle/jellytau-builder:latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

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

      - name: Cache Node dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.bun/install/cache
            node_modules
          key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
          restore-keys: |
            ${{ runner.os }}-bun-

      - name: Install dependencies
        run: |
          bun install

      # Tripwire for domain-taxonomy leaks into the presentation layer (a
      # multi-type includeItemTypes query defining a category in the frontend).
      # See scripts/check-frontend-boundary.sh and
      # docs/specs/scoped-search-boundary.md.
      - name: Check frontend/backend boundary
        run: bash scripts/check-frontend-boundary.sh

      - name: Run frontend tests
        run: |
          bunx svelte-kit sync
          bun run test

      - name: Run Rust tests
        run: |
          cd src-tauri
          cargo test
          cd ..

  # Fast per-commit Android compile check. This does NOT build a shippable APK:
  # the full signed release APK is built only on tag pushes by build-release.yml
  # (which runs sync-android-sources.sh + signing). Running the full bundle here
  # too would duplicate a ~15min build and, without the sync step, produced an
  # unsigned APK missing our custom sources/icons/proguard rules anyway.
  # `cargo check` for the Android target (~1min) catches Android-specific Rust
  # breakage without linking, bundling, or signing.
  android-check:
    name: Android Compile Check
    runs-on: linux/amd64
    needs: test
    container:
      image: gitea.tourolle.paris/dtourolle/jellytau-builder:latest
    env:
      ANDROID_HOME: /opt/android-sdk
      ANDROID_SDK_ROOT: /opt/android-sdk
      NDK_HOME: /opt/android-sdk/ndk/27.0.11902837
      ANDROID_NDK_HOME: /opt/android-sdk/ndk/27.0.11902837

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

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

      - name: Cache Node dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.bun/install/cache
            node_modules
          key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
          restore-keys: |
            ${{ runner.os }}-bun-

      - name: Install dependencies
        run: bun install

      - name: Cargo check (aarch64-linux-android)
        run: |
          TC="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin"
          export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TC/aarch64-linux-android24-clang"
          export CC_aarch64_linux_android="$TC/aarch64-linux-android24-clang"
          export AR_aarch64_linux_android="$TC/llvm-ar"
          cd src-tauri
          cargo check --target aarch64-linux-android --lib
