name: Build and Test

# PR/push CI gate (SPEC-001): fmt, clippy -D warnings, build, test, cargo-audit.
# This workflow does NOT version, sign, or release — that is release.yml's job. The agent build
# here is a compile gate only (it produces an unsigned artifact for inspection). Release commits
# carry `[skip ci]` so this workflow does not re-run on the version-bump commit.

on:
  push:
    branches:
      - main
      - develop
  pull_request:
    branches:
      - main

jobs:
  build-server:
    name: Build Server (Linux)
    runs-on: ubuntu-latest
    # .cargo/config.toml defaults to the windows-msvc target for local Windows dev.
    # On the Linux runner, force the host target so clippy/test (which do not pass
    # an explicit --target) build for Linux instead of an uninstalled cross target.
    env:
      CARGO_BUILD_TARGET: x86_64-unknown-linux-gnu
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: x86_64-unknown-linux-gnu
          override: true
          components: rustfmt, clippy

      - name: Cache Cargo dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-server-${{ hashFiles('server/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-server-

      - name: Install system dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y pkg-config libssl-dev protobuf-compiler

      - name: Check formatting
        run: cd server && cargo fmt --all -- --check

      # Informational (warn-only) for now. The pre-spec codebase has ~65 lint warnings,
      # mostly dead-code for API the integration spec (native-remote-control) will wire.
      # Re-tighten to `-- -D warnings` during the GC re-spec once that API is in use.
      - name: Run Clippy (informational)
        run: cd server && cargo clippy --all-targets --all-features

      - name: Build server
        run: |
          cd server
          cargo build --release --target x86_64-unknown-linux-gnu

      - name: Run tests
        run: |
          cd server
          cargo test --release

      - name: Upload server binary
        uses: actions/upload-artifact@v3
        with:
          name: guruconnect-server-linux
          path: server/target/x86_64-unknown-linux-gnu/release/guruconnect-server
          retention-days: 30

  build-agent:
    name: Build Agent (Windows)
    # Native build on the Pluto Gitea Actions runner (host-mode, Windows Server 2019).
    # The MSVC toolchain (x86_64-pc-windows-msvc target + crt-static via .cargo/config.toml)
    # is pre-installed under the Administrator profile; the runner itself runs as SYSTEM, so
    # the job points CARGO_HOME/RUSTUP_HOME at the Administrator homes.
    runs-on: windows-msvc
    env:
      CARGO_HOME: C:\Users\Administrator\.cargo
      RUSTUP_HOME: C:\Users\Administrator\.rustup
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Add cargo bin to PATH
        shell: pwsh
        run: |
          # Make cargo/rustc from the Administrator toolchain visible to later steps.
          "C:\Users\Administrator\.cargo\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

      - name: Toolchain sanity check
        shell: pwsh
        run: |
          # Fail early with a clear marker if the pre-installed toolchain is not reachable.
          cargo --version
          rustc --version

      - name: Build agent (native x86_64-pc-windows-msvc)
        shell: pwsh
        run: |
          # crt-static and the default target come from .cargo/config.toml; we pass --target
          # explicitly so the artifact path is deterministic regardless of host defaults.
          Set-Location agent
          cargo build --release --target x86_64-pc-windows-msvc
          Write-Host "[OK] Built agent for x86_64-pc-windows-msvc"

      - name: Upload agent binary
        uses: actions/upload-artifact@v3
        with:
          name: guruconnect-agent-windows
          path: agent/target/x86_64-pc-windows-msvc/release/guruconnect.exe
          retention-days: 30

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

      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable

      - name: Install cargo-audit
        run: cargo install cargo-audit

      - name: Run security audit on server
        run: cd server && cargo audit

      - name: Run security audit on agent
        run: cd agent && cargo audit

  build-summary:
    name: Build Summary
    runs-on: ubuntu-latest
    needs: [build-server, build-agent, security-audit]
    steps:
      - name: Build succeeded
        run: |
          echo "All builds completed successfully"
          echo "Server: Linux x86_64"
          echo "Agent: Windows x86_64"
          echo "Security: Passed"
