#!/usr/bin/env bash
# agent-status.sh — agent 池状态 dashboard
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=../lib/agent-pool-lib.sh
source "${SCRIPT_DIR}/../lib/agent-pool-lib.sh"

POOL_ROOT="$(ap_pool_root)"

if ! ap_pool_enabled; then
  echo "agent-status: 池被显式禁用（FFOA_AGENT_POOL_ENABLED=false）"
  exit 0
fi

if [[ ! -d "${POOL_ROOT}" ]]; then
  echo "agent-status: 池根目录不存在: ${POOL_ROOT}"
  echo "提示: 池未初始化（agent 调用方应主动询问用户是否初始化）"
  exit 0
fi

slots=$(ap_list_slots)
if [[ -z "${slots}" ]]; then
  echo "agent-status: 池为空（${POOL_ROOT}）"
  echo "提示: 池未初始化（agent 调用方应主动询问用户是否初始化）"
  exit 0
fi

printf "池根目录: %s\n\n" "${POOL_ROOT}"
printf "%-6s %-9s %-30s %-22s %-7s %s\n" "SLOT" "STATE" "BRANCH" "AGENT" "PID" "HEARTBEAT"
printf "%-6s %-9s %-30s %-22s %-7s %s\n" "----" "-----" "------" "-----" "---" "---------"

# 颜色（仅 stdout 是 tty 时启用）
if [[ -t 1 ]]; then
  C_RED=$'\033[31m'; C_YEL=$'\033[33m'; C_RST=$'\033[0m'
else
  C_RED=""; C_YEL=""; C_RST=""
fi

abandoned_seen=0
for slot in ${slots}; do
  state="$(ap_slot_state "${slot}")"
  case "${state}" in
    free)
      printf "%-6s %-9s %-30s %-22s %-7s %s\n" "${slot}" "free" "-" "-" "-" "-"
      ;;
    abandoned)
      branch="$(ap_read_lock "${slot}" task_branch || echo '?')"
      agent="$(ap_read_lock "${slot}" agent || echo '?')"
      reason="$(ap_read_lock "${slot}" abandoned_reason || echo '?')"
      at="$(ap_read_lock "${slot}" abandoned_at || echo '?')"
      printf "${C_RED}%-6s %-9s %-30s %-22s %-7s %s${C_RST}\n" \
        "${slot}" "abandoned" "${branch}" "${agent}" "${reason}" "${at}"
      abandoned_seen=1
      ;;
    claimed|stale)
      branch="$(ap_read_lock "${slot}" task_branch || echo '?')"
      agent="$(ap_read_lock "${slot}" agent || echo '?')"
      pid="$(ap_read_lock "${slot}" pid || echo '?')"
      hb="$(ap_read_lock "${slot}" heartbeat_at || echo '?')"
      color=""
      [[ "${state}" == stale ]] && color="${C_YEL}"
      printf "${color}%-6s %-9s %-30s %-22s %-7s %s${C_RST}\n" \
        "${slot}" "${state}" "${branch}" "${agent}" "${pid}" "${hb}"
      ;;
  esac
done

if (( abandoned_seen == 1 )); then
  echo
  echo "${C_RED}⚠ 有 abandoned slot 需人工处理${C_RST}"
  echo "  reason=dirty     → 工作区有未提交改动"
  echo "  reason=unpushed  → 有 commit 未推送到远端"
  echo "  reason=manual    → --keep-changes 标记"
  echo "  接手继续：cd 进 worktree，commit/push 后 bash scripts/dev/agent-pool/agent-release.sh <slot> --keep-changes"
  echo "  确认丢弃：bash scripts/dev/agent-pool/agent-release.sh <slot> --force"
fi

echo
echo "操作:"
echo "  claim:    eval \"\$(bash scripts/dev/agent-pool/agent-claim.sh <branch>)\""
echo "  release:  bash scripts/dev/agent-pool/agent-release.sh [<slot>]"
echo "  sweep:    bash scripts/dev/agent-pool/agent-sweep.sh"
echo "  resize:   bash scripts/dev/agent-pool/pool-resize.sh --size N"
echo "  destroy:  bash scripts/dev/agent-pool/pool-destroy.sh"
