name: BFLD MQTT Integration

# Runs the env-gated mosquitto integration tests from iters 24 + 29 of the
# BFLD rollout (ADR-118 / ADR-122 §2.2). Spins up an eclipse-mosquitto:2
# service container, exports BFLD_MQTT_BROKER, runs `cargo test --features
# mqtt`. Local developers can reproduce with:
#
#     scoop install mosquitto   # Windows
#     # or: docker run -p 1883:1883 eclipse-mosquitto:2
#     BFLD_MQTT_BROKER=tcp://localhost:1883 \
#       cargo test -p wifi-densepose-bfld --features mqtt

on:
  push:
    branches:
      - main
      - 'feat/adr-118-*'
      - 'feat/bfld-*'
    paths:
      - 'v2/crates/wifi-densepose-bfld/**'
      - '.github/workflows/bfld-mqtt-integration.yml'
  pull_request:
    paths:
      - 'v2/crates/wifi-densepose-bfld/**'
      - '.github/workflows/bfld-mqtt-integration.yml'
  workflow_dispatch:

jobs:
  mqtt-live-broker:
    name: cargo test --features mqtt (live mosquitto)
    runs-on: ubuntu-latest
    timeout-minutes: 15

    services:
      mosquitto:
        image: eclipse-mosquitto:2
        ports:
          - 1883:1883
        # Allow anonymous connections — local-only CI broker, no exposure
        # to the public internet, never touches production credentials.
        options: >-
          --health-cmd "mosquitto_pub -h localhost -t healthcheck -m ping || exit 1"
          --health-interval 5s
          --health-timeout 3s
          --health-retries 10

    env:
      BFLD_MQTT_BROKER: tcp://localhost:1883
      CARGO_TERM_COLOR: always
      CARGO_INCREMENTAL: 0
      RUSTFLAGS: -D warnings

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

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

      - name: Cache cargo registry + target
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            v2/target
          key: bfld-mqtt-${{ runner.os }}-${{ hashFiles('v2/Cargo.lock') }}

      - name: Wait for mosquitto to be ready
        run: |
          for i in {1..20}; do
            if nc -z localhost 1883; then
              echo "mosquitto reachable on port 1883 (attempt $i)"
              exit 0
            fi
            echo "waiting for mosquitto ($i/20)..."
            sleep 1
          done
          echo "mosquitto never became reachable" >&2
          exit 1

      - name: cargo test --no-default-features (baseline regression)
        working-directory: v2
        run: cargo test -p wifi-densepose-bfld --no-default-features

      - name: cargo test (default features)
        working-directory: v2
        run: cargo test -p wifi-densepose-bfld

      - name: cargo test --features mqtt (incl. live mosquitto roundtrip)
        working-directory: v2
        run: cargo test -p wifi-densepose-bfld --features mqtt

      - name: cargo clippy --features mqtt (lint gate)
        working-directory: v2
        run: cargo clippy -p wifi-densepose-bfld --features mqtt --all-targets -- -D warnings
        continue-on-error: true
