name: 'CI - Lint and Test'

on:
  workflow_dispatch:
  pull_request:
    branches: [ main, dev ]
    paths:
      - 'src/**'
      - 'src-tauri/**'
      - 'package.json'
      - 'package-lock.json'
      - 'yarn.lock'
      - 'Cargo.toml'
      - 'Cargo.lock'
      - '.github/workflows/ci.yml'

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

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

jobs:
  frontend-lint:
    name: Frontend Lint & Type Check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'yarn'

      - name: Install dependencies
        run: yarn install

      - name: Run ESLint
        run: yarn lint

      - name: Run TypeScript type check
        run: yarn web:build --mode=production

  rust-check:
    name: Rust Check & Lint
    runs-on: ${{ matrix.platform.os }}
    strategy:
      fail-fast: false
      matrix:
        platform:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          - os: macos-13
            target: x86_64-apple-darwin
          - os: macos-latest
            target: aarch64-apple-darwin

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

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@nightly
        with:
          targets: ${{ matrix.platform.target }}
          components: rustfmt, clippy

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          workspaces: src-tauri
          cache-on-failure: true

      - name: Install system dependencies (Linux)
        if: matrix.platform.os == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'yarn'

      - name: Install frontend dependencies
        run: yarn install

      - name: Run prebuild script
        run: yarn prebuild:dev

      - name: Check Rust formatting
        working-directory: src-tauri
        run: cargo fmt --all -- --check

      - name: Run Clippy
        working-directory: src-tauri
        run: cargo clippy --target ${{ matrix.platform.target }} --all-targets --all-features -- -D warnings

      - name: Run Cargo check
        working-directory: src-tauri
        run: cargo check --target ${{ matrix.platform.target }} --all-targets --all-features

      - name: Run Rust tests
        working-directory: src-tauri
        run: cargo test --target ${{ matrix.platform.target }} --all-features

  security-audit:
    name: Security Audit
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'yarn'

      - name: Install dependencies
        run: yarn install

      - name: Run npm audit
        run: yarn audit --audit-level moderate

  build-test:
    name: Build Test
    runs-on: ${{ matrix.platform.os }}
    needs: [frontend-lint, rust-check]
    strategy:
      fail-fast: false
      matrix:
        platform:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          - os: macos-13
            target: x86_64-apple-darwin

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

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@nightly
        with:
          targets: ${{ matrix.platform.target }}

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          workspaces: src-tauri
          cache-on-failure: true

      - name: Install system dependencies (Linux)
        if: matrix.platform.os == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y libxslt1.1 libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'yarn'

      - name: Install frontend dependencies
        run: yarn install

      - name: Run prebuild script
        run: yarn prebuild:dev

      - name: Build frontend
        run: yarn web:build

      - name: Build Tauri application (test build)
        working-directory: src-tauri
        run: cargo build --target ${{ matrix.platform.target }} --release
