#!/bin/zsh
# RackPilot Edge — установщик для macOS (Phase 4, ТЗ §12).
# Скачивает безголовый Edge, ставит в ~/RackPilotEdge, регистрируется в
# Control Plane по коду активации, поднимает как launchd-агент.
#
# Использование:
#   ./install-macos.sh --code RP-XXXX-XXXX-XXXX [--name my-edge] [--dir DIR] [--no-start]
#
# Данные (data/) и identity узла отделены от кода (§33): переустановка кода их
# не трогает.
set -eu

CONTROL_PLANE="${CONTROL_PLANE_URL:-https://api.rackandcode.dev}"
BUNDLE_URL="${EDGE_BUNDLE_URL:-https://rackandcode.dev/download/edge/rackpilot-edge-latest.tar.gz}"
INSTALL_DIR="$HOME/RackPilotEdge"
NODE_NAME="$(hostname -s)"
ACTIVATION=""
START=1

while [ $# -gt 0 ]; do
  case "$1" in
    --code) ACTIVATION="$2"; shift 2;;
    --name) NODE_NAME="$2"; shift 2;;
    --dir) INSTALL_DIR="$2"; shift 2;;
    --no-start) START=0; shift;;
    *) echo "неизвестный аргумент: $1"; exit 1;;
  esac
done

if [ -z "$ACTIVATION" ]; then
  printf "Код активации (из Valeronix Control): "; read ACTIVATION
fi
[ -z "$ACTIVATION" ] && { echo "нужен код активации"; exit 1; }

# Подбираем Python с готовыми колёсами зависимостей (3.14 пока без wheel'ов
# для pydantic-core → сборка из исходников падает). Предпочитаем 3.12/3.13/3.11.
PYBIN=""
for cand in python3.12 python3.13 python3.11 python3; do
  if command -v "$cand" >/dev/null; then
    ver="$("$cand" -c 'import sys;print("%d.%d"%sys.version_info[:2])' 2>/dev/null || echo "")"
    case "$ver" in 3.11|3.12|3.13) PYBIN="$cand"; break;; esac
  fi
done
if [ -z "$PYBIN" ]; then
  echo "нужен Python 3.11–3.13 (найден только $(python3 -V 2>/dev/null))."
  echo "Установите: brew install python@3.12"
  exit 1
fi
echo "→ Python: $PYBIN ($("$PYBIN" -V))"

echo "→ RackPilot Edge → $INSTALL_DIR"
mkdir -p "$INSTALL_DIR/app" "$INSTALL_DIR/data"

echo "→ загрузка бандла…"
TMP="$(mktemp -d)"
curl -fsSL "$BUNDLE_URL" -o "$TMP/edge.tar.gz"
tar -xzf "$TMP/edge.tar.gz" -C "$TMP"
rsync -a --delete --exclude='data' "$TMP/rackpilot-edge/" "$INSTALL_DIR/app/"
rm -rf "$TMP"

echo "→ python-окружение…"
"$PYBIN" -m venv "$INSTALL_DIR/venv"
"$INSTALL_DIR/venv/bin/pip" install -q --upgrade pip
"$INSTALL_DIR/venv/bin/pip" install -q -r "$INSTALL_DIR/app/backend/requirements.txt"

# .env Edge: адрес Control Plane, код активации (для первой регистрации),
# имя узла. Данные и master_key живут в data/ отдельно от кода.
cat > "$INSTALL_DIR/.env" <<EOF
CONTROL_PLANE_URL=$CONTROL_PLANE
CONTROL_PLANE_LICENSE_KEY=$ACTIVATION
EDGE_NODE_NAME=$NODE_NAME
DB_PATH=$INSTALL_DIR/data/rackpilot.db
PORT=4177
EOF
chmod 600 "$INSTALL_DIR/.env"

PLIST="$HOME/Library/LaunchAgents/com.rackpilot.edge.plist"
cat > "$PLIST" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>com.rackpilot.edge</string>
  <key>ProgramArguments</key><array>
    <string>$INSTALL_DIR/venv/bin/python3</string><string>run.py</string></array>
  <key>WorkingDirectory</key><string>$INSTALL_DIR/app/backend</string>
  <key>EnvironmentVariables</key><dict>
    <key>RP_ENV_FILE</key><string>$INSTALL_DIR/.env</string>
    <key>PATH</key><string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string></dict>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>
  <key>StandardOutPath</key><string>$INSTALL_DIR/data/edge.log</string>
  <key>StandardErrorPath</key><string>$INSTALL_DIR/data/edge.log</string>
</dict></plist>
EOF

if [ "$START" -eq 1 ]; then
  launchctl bootout "gui/$(id -u)/com.rackpilot.edge" 2>/dev/null || true
  sleep 1
  launchctl bootstrap "gui/$(id -u)" "$PLIST"
  echo "→ Edge запущен. Логи: $INSTALL_DIR/data/edge.log"
  echo "→ Регистрация в Control Plane выполнится автоматически."
else
  echo "→ Установлено без запуска (--no-start)."
fi
echo "Готово. Узел: $NODE_NAME → $CONTROL_PLANE"
