name: Quality & Tests

on:
  workflow_dispatch:
  pull_request:
    branches: [ develop ]

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

permissions:
  contents: read

jobs:
  dart:
    name: Dart
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Read Flutter version
        id: fv
        run: echo "version=$(jq -r '.flutter' .fvmrc)" >> "$GITHUB_OUTPUT"

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: ${{ steps.fv.outputs.version }}

      - name: Set up Melos (bootstrap)
        uses: bluefireteam/melos-action@v3
        with:
          melos-version: 8.2.2

      - name: Check generated bindings
        run: dart tool/check_generated.dart

      - name: Analyze
        run: flutter analyze

      - name: Check layer dependencies
        run: dart tool/check_layers.dart

      # 真库集成测试靠 ISAR_TEST_DYLIB 解除 skip;找不到即 exit 1,不许静默全跳过。
      - name: Locate Isar test dylib
        run: |
          root=$(python3 -c "import json;d=json.load(open('.dart_tool/package_config.json'));print(next(p['rootUri'] for p in d['packages'] if p['name']=='isar_plus_flutter_libs'))")
          so="${root#file://}/linux/libisar_plus.so"
          if [ ! -f "$so" ]; then
            echo "libisar_plus.so not found at $so" >&2
            exit 1
          fi
          echo "ISAR_TEST_DYLIB=$so" >> "$GITHUB_ENV"

      - name: Test
        run: dart tool/task.dart test --all

  rust:
    name: Rust
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - name: Clippy + Test (all six native packages)
        working-directory: packages/foundation
        run: |
          for d in */rust; do
            echo "== $d"
            (cd "$d" && cargo clippy --all-targets -- -D warnings && cargo test)
          done

  editor:
    name: Editor
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: packages/feature_base/moodiary_editor/editor
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 24

      - name: Enable Corepack
        run: corepack enable

      - name: Install
        run: corepack pnpm install --frozen-lockfile

      - name: Type-check
        run: corepack pnpm type-check

      - name: Test
        run: corepack pnpm test