#!/usr/bin/env bash
# desktop_field_bridge · field file for krtx-engine widgets · NO browser
# Talks full system → Desktop/x/out/desktop_field.txt (engine polls)
# Law: BGS→BGF→BGL→SDF · SPV free · solo secure desktop
set -u
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
OUT="$ROOT/out"
ENG="$ROOT/KateRTX/engine"
mkdir -p "$OUT" "$ENG"
FIELD="$OUT/desktop_field.txt"
# also under engine root for --root relative read
FIELD2="$ENG/desktop_field.txt"
MODE="${1:-once}"   # once | continuous
SELF=$$
LOCK="$OUT/desktop_field_bridge.lock"
PIDF="$OUT/desktop_field_bridge.pid"

write_field() {
  local pub bgl cam aud hunter eng_n mf mc bgf_v tC at_ez at_th
  pub=$(ss -ltn 2>/dev/null | awk 'NR>1 && $4 !~ /127\.|::1/ {c++} END{print c+0}')
  bgl=$(( pub==0 ? 1 : 0 ))
  cam=0; aud=0
  if fuser /dev/video0 >/dev/null 2>&1; then cam=1; fi
  if fuser /dev/snd/pcmC1D0c >/dev/null 2>&1; then aud=1; fi
  hunter=0
  if [[ -f "$OUT/av_hunter.pid" ]]; then
    local hp; hp=$(cat "$OUT/av_hunter.pid" 2>/dev/null || echo)
    [[ -n "$hp" && -d /proc/$hp ]] && hunter=1
  fi
  eng_n=$(ps -eo stat=,args= 2>/dev/null | awk '$1!~/Z/ && /KateRTX\/bin\/krtx-engine/ {c++} END{print c+0}')
  mf=$(awk '/^MemFree:/{print $2;exit}' /proc/meminfo)
  mc=$(awk '/^Cached:/{print $2;exit}' /proc/meminfo)
  bgf_v=$(( (mf - mc) | 1 ))
  tC=30
  [[ -r /sys/class/thermal/thermal_zone0/temp ]] && tC=$(( $(cat /sys/class/thermal/thermal_zone0/temp)/1000 )) || true
  at_ez=$(( (mf ^ mc) | 1 ))
  if (( tC <= 70 )); then at_th=$((0|1)); elif (( tC <= 84 )); then at_th=$((1|1)); else at_th=$((2|1)); fi
  # seed for compute: pack small secure bits into int
  local seed=$(( (bgl) | (pub<<1) | (cam<<2) | (aud<<3) | (hunter<<4) | 1 ))

  {
    echo "ts=$(date -Iseconds)"
    echo "pub=$pub"
    echo "bgl=$bgl"
    echo "cam=$cam"
    echo "aud=$aud"
    echo "hunter=$hunter"
    echo "engines=$eng_n"
    echo "bgf=$bgf_v"
    echo "ezzie=$at_ez"
    echo "thermo=$at_th"
    echo "temp_C=$tC"
    echo "seed=$seed"
    echo "law=BGS>BGF>BGL>SDF"
    echo "product=os_desktop_native"
    echo "browser=0"
  } >"$FIELD"
  cp -f "$FIELD" "$FIELD2" 2>/dev/null || true
  # also for --root KateRTX/engine
  cp -f "$FIELD" "$ROOT/KateRTX/out/desktop_field.txt" 2>/dev/null || true
}

case "$MODE" in
  continuous|always)
    exec 7>"$LOCK"
    flock -n 7 || { echo "field bridge already running"; exit 0; }
    echo "$SELF" >"$PIDF"
    while true; do
      write_field
      # light cadence · not thrash · field still "live"
      sleep 2
    done
    ;;
  once|*)
    write_field
    echo "wrote $FIELD"
    cat "$FIELD"
    ;;
esac
