#!/usr/bin/env bash
set -euo pipefail

PROJECT="/home/agent/projects/CryptoTradingBot/Crypto_Agent"
RUNTIME="/home/agent/.local/state/CryptoTradingBot"
PY="$PROJECT/.venv/bin/python"
EXPECTED=(
  "candidate_v66_squeeze_breakout_sampler"
  "candidate_v69_squeeze_breakout_confirmed"
  "candidate_v74_relative_strength_breadth_guard"
  "candidate_v75_hybrid_survival_squeeze"
)

is_expected() {
  local sid="$1"
  for expected in "${EXPECTED[@]}"; do
    [[ "$sid" == "$expected" ]] && return 0
  done
  return 1
}

read_env_value() {
  local pid="$1" key="$2"
  tr '\0' '\n' < "/proc/$pid/environ" 2>/dev/null | awk -F= -v k="$key" '$1==k {print substr($0, length(k)+2); exit}'
}

# Stop focused-fleet AutoTrader processes that are not in the approved list.
while read -r pid; do
  [[ -z "$pid" ]] && continue
  sid="$(read_env_value "$pid" CTB_STRATEGY_ID || true)"
  paper="$(read_env_value "$pid" CTB_PAPER_TRADING || true)"
  dry="$(read_env_value "$pid" CTB_DRY_RUN || true)"
  rdir="$(read_env_value "$pid" CTB_RUNTIME_DIR || true)"
  if [[ "$rdir" == "$RUNTIME"/experiments/* ]]; then
    if ! is_expected "$sid"; then
      echo "stopping_unexpected pid=$pid strategy=$sid paper=$paper dry=$dry"
      kill "$pid" 2>/dev/null || true
    fi
  fi
done < <(pgrep -f '^/home/agent/projects/CryptoTradingBot/Crypto_Agent/.venv/bin/python AutoTrader.py$' || true)

sleep 2
while read -r pid; do
  [[ -z "$pid" ]] && continue
  sid="$(read_env_value "$pid" CTB_STRATEGY_ID || true)"
  rdir="$(read_env_value "$pid" CTB_RUNTIME_DIR || true)"
  if [[ "$rdir" == "$RUNTIME"/experiments/* ]] && ! is_expected "$sid"; then
    kill -9 "$pid" 2>/dev/null || true
  fi
done < <(pgrep -f '^/home/agent/projects/CryptoTradingBot/Crypto_Agent/.venv/bin/python AutoTrader.py$' || true)

# Start only missing expected paper strategies.
missing=()
for sid in "${EXPECTED[@]}"; do
  found=0
  while read -r pid; do
    [[ -z "$pid" ]] && continue
    psid="$(read_env_value "$pid" CTB_STRATEGY_ID || true)"
    paper="$(read_env_value "$pid" CTB_PAPER_TRADING || true)"
    dry="$(read_env_value "$pid" CTB_DRY_RUN || true)"
    if [[ "$psid" == "$sid" && "$paper" == "true" && "$dry" == "false" ]]; then
      found=1
      break
    fi
  done < <(pgrep -f '^/home/agent/projects/CryptoTradingBot/Crypto_Agent/.venv/bin/python AutoTrader.py$' || true)
  [[ "$found" == 0 ]] && missing+=("$sid")
done

if ((${#missing[@]} > 0)); then
  cd "$PROJECT"
  "$PY" multi_strategy_launcher.py --runtime-dir "$RUNTIME" --max-parallel "${#missing[@]}" --strategies "${missing[@]}" --launch
fi

# Verify exact expected set and paper-only mode.
bad=0
running_expected=0
while read -r pid; do
  [[ -z "$pid" ]] && continue
  sid="$(read_env_value "$pid" CTB_STRATEGY_ID || true)"
  paper="$(read_env_value "$pid" CTB_PAPER_TRADING || true)"
  dry="$(read_env_value "$pid" CTB_DRY_RUN || true)"
  rdir="$(read_env_value "$pid" CTB_RUNTIME_DIR || true)"
  if [[ "$rdir" == "$RUNTIME"/experiments/* ]]; then
    if is_expected "$sid" && [[ "$paper" == "true" && "$dry" == "false" ]]; then
      ((running_expected+=1))
    else
      echo "unsafe_or_unexpected pid=$pid strategy=$sid paper=$paper dry=$dry runtime=$rdir"
      bad=1
    fi
  fi
done < <(pgrep -f '^/home/agent/projects/CryptoTradingBot/Crypto_Agent/.venv/bin/python AutoTrader.py$' || true)

if [[ "$running_expected" -ne "${#EXPECTED[@]}" ]]; then
  echo "expected_count=${#EXPECTED[@]} running_expected=$running_expected"
  bad=1
fi

exit "$bad"
