#!/usr/bin/env bash
# pool-init.sh — 初始化开发 agent 池（默认 3 个 slot）
# 调用现有 setup-worktree.sh 完成端口/PG/Redis/.env/依赖 的预热。
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_SIZE="${FFOA_AGENT_POOL_SIZE:-3}"
SETUP_SCRIPT="${SCRIPT_DIR}/../setup-worktree.sh"

# setup-worktree.sh 用 git rev-parse --show-toplevel 取 ROOT_DIR 拷贝 .env，
# 从裸 worktree（无 .env）调用会失败，必须从主仓库目录调起。
MAIN_REPO_DIR="$(cd "$(git rev-parse --path-format=absolute --git-common-dir)/.." && pwd)"

# 资源预算（per slot 经验值）
DISK_PER_SLOT_GB=3        # node_modules + .next + 其它构建产物
RAM_PER_SLOT_MB=50        # PG 容器 + Redis 容器 + heartbeat 守护
DISK_BUFFER_GB=2          # 留给系统的余量

usage() {
  cat <<EOF
用法:
  bash $0 [--size N] [--minimal] [--force] [--skip-preflight]

选项:
  --size N           池中 slot 数量（默认 3，可通过 FFOA_AGENT_POOL_SIZE 覆盖）
  --minimal          仅 git worktree add，不跑 setup-worktree.sh 的 docker / npm install
                     （测试 / CI 用，生产请省略）
  --force            已存在的 slot 也重新跑 setup（慎用，会重建容器）
  --skip-preflight   跳过磁盘/RAM/端口资源预检查（不推荐）

环境变量:
  FFOA_AGENT_POOL_ROOT     池根目录（默认探测，约定 .agent-pool/）
  FFOA_AGENT_POOL_SIZE     池大小（默认 3）
  FFOA_AGENT_POOL_ENABLED  设为 false 则禁止初始化（CI 安全开关）
EOF
}

MINIMAL=false
FORCE=false
SKIP_PREFLIGHT=false
while [[ $# -gt 0 ]]; do
  case "$1" in
    --size) POOL_SIZE="$2"; shift 2 ;;
    --minimal) MINIMAL=true; shift ;;
    --force) FORCE=true; shift ;;
    --skip-preflight) SKIP_PREFLIGHT=true; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo "未知参数: $1" >&2; usage; exit 1 ;;
  esac
done

if ! ap_pool_enabled; then
  echo "pool-init: 池被显式禁用（FFOA_AGENT_POOL_ENABLED=false），拒绝初始化" >&2
  exit 5
fi

POOL_ROOT="$(ap_pool_root)"

# ---------- pre-flight ----------
preflight_check() {
  local need_disk=$(( POOL_SIZE * DISK_PER_SLOT_GB + DISK_BUFFER_GB ))
  local free_disk_gb
  free_disk_gb=$(df -BG --output=avail / | tail -1 | tr -dc '0-9')

  echo "pool-init: pre-flight 资源检查"
  echo "  目标 slot 数:  ${POOL_SIZE}"
  echo "  需要磁盘约:    ${need_disk} GB（每 slot ~${DISK_PER_SLOT_GB} GB + ${DISK_BUFFER_GB} GB 缓冲）"
  echo "  当前可用:      ${free_disk_gb} GB"

  if (( free_disk_gb < need_disk )); then
    echo "  ⚠️  磁盘可能不够，建议：" >&2
    echo "     - 缩小池：--size $(( (free_disk_gb - DISK_BUFFER_GB) / DISK_PER_SLOT_GB ))" >&2
    echo "     - 或先腾空间（docker prune / 删旧 worktree）" >&2
    return 1
  fi

  # RAM 粗检（per slot ~50MB 容器 + 100MB 余量）
  local need_ram_mb=$(( POOL_SIZE * (RAM_PER_SLOT_MB + 100) ))
  local avail_ram_mb
  avail_ram_mb=$(free -m | awk '/^Mem:/ {print $7}')
  echo "  需要内存约:    ${need_ram_mb} MB"
  echo "  当前可用:      ${avail_ram_mb} MB"
  if (( avail_ram_mb < need_ram_mb )); then
    echo "  ⚠️  内存余量紧（不致命，仅警告）" >&2
  fi

  # 端口冲突探测（slot N 用 (3{N+0}xx 等等，由 setup-worktree.sh 动态分配，仅做总体检查）
  echo "  端口段:        setup-worktree.sh 在 31xx-89xx 内动态分配（如有冲突会自动跳）"
  return 0
}

if [[ "${SKIP_PREFLIGHT}" != true && "${MINIMAL}" != true ]]; then
  if ! preflight_check; then
    echo "" >&2
    echo "pool-init: 资源检查未通过。强制继续请加 --skip-preflight" >&2
    exit 6
  fi
  echo ""
fi

# ---------- 初始化 ----------
mkdir -p "${POOL_ROOT}"

echo "pool-init: 池根目录: ${POOL_ROOT}"
echo "pool-init: 目标 slot 数量: ${POOL_SIZE}"
echo "pool-init: 模式: $([[ "${MINIMAL}" == true ]] && echo minimal || echo full)"

for i in $(seq 1 "${POOL_SIZE}"); do
  slot_dir="${POOL_ROOT}/slot-${i}"
  park_branch="pool/slot-${i}"

  if [[ -d "${slot_dir}" && "${FORCE}" != true ]]; then
    echo "pool-init: slot-${i} 已存在，跳过（--force 强制重建）"
    continue
  fi

  echo
  echo "==================================="
  echo "pool-init: 初始化 slot-${i}"
  echo "==================================="

  if [[ "${MINIMAL}" == true ]]; then
    if git show-ref --verify --quiet "refs/heads/${park_branch}"; then
      git worktree add "${slot_dir}" "${park_branch}" 2>&1 | sed 's/^/  /'
    else
      git worktree add "${slot_dir}" -b "${park_branch}" origin/develop 2>&1 | sed 's/^/  /'
    fi
  else
    # 从主仓库目录调起，否则 setup-worktree.sh 取不到源 .env
    (cd "${MAIN_REPO_DIR}" && bash "${SETUP_SCRIPT}" "${slot_dir}" "${park_branch}" develop copy) 2>&1 | sed 's/^/  /'
  fi

  echo "pool-init: slot-${i} 完成 → ${slot_dir}"
done

ap_write_code_workspace || true

echo
echo "pool-init: 池初始化完成。使用 'bash scripts/dev/agent-pool/agent-status.sh' 查看状态。"
