#!/usr/bin/env bash
# 莆阳 Linux 手脚（无托盘 / systemd 常驻）
# 用法：
#   curl -fsSL https://agent.py99999.com/api/hands/install.sh | bash -s -- \
#     --brain https://agent.py99999.com --install-token TOKEN
# 或：BRAIN=... INSTALL_TOKEN=... bash install.sh
set -euo pipefail

BRAIN="${BRAIN:-https://agent.py99999.com}"
INSTALL_TOKEN="${INSTALL_TOKEN:-}"
PAIR_CODE="${PAIR_CODE:-}"
INSTALL_DIR="${INSTALL_DIR:-${HOME}/.local/share/BailongHands}"
SERVICE_NAME="${SERVICE_NAME:-bailong-hands}"
PYTHON_BIN="${PYTHON_BIN:-}"
HEADLESS=1
NAME_HINT="${NAME_HINT:-}"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --brain) BRAIN="$2"; shift 2 ;;
    --install-token) INSTALL_TOKEN="$2"; shift 2 ;;
    --pair) PAIR_CODE="$2"; shift 2 ;;
    --dir) INSTALL_DIR="$2"; shift 2 ;;
    --name) NAME_HINT="$2"; shift 2 ;;
    --python) PYTHON_BIN="$2"; shift 2 ;;
    *) echo "unknown arg: $1"; exit 2 ;;
  esac
done

BRAIN="${BRAIN%/}"
echo "=== 莆阳 Linux 手脚 ==="
echo "brain=$BRAIN"
echo "dir=$INSTALL_DIR"

mkdir -p "$INSTALL_DIR"
TMP_ZIP="$(mktemp /tmp/bailong-hands-XXXXXX.zip)"
curl -fsSL "${BRAIN}/api/hands/bundle.zip" -o "$TMP_ZIP"
rm -rf "${INSTALL_DIR}/.extract"
mkdir -p "${INSTALL_DIR}/.extract"
unzip -qo "$TMP_ZIP" -d "${INSTALL_DIR}/.extract"
if [[ -d "${INSTALL_DIR}/.extract/bailong-hands" ]]; then
  cp -a "${INSTALL_DIR}/.extract/bailong-hands/." "$INSTALL_DIR/"
else
  cp -a "${INSTALL_DIR}/.extract/." "$INSTALL_DIR/"
fi
rm -rf "${INSTALL_DIR}/.extract" "$TMP_ZIP"

if [[ -z "$PYTHON_BIN" ]]; then
  for c in python3.12 python3.11 python3 python; do
    if command -v "$c" >/dev/null 2>&1; then
      PYTHON_BIN="$(command -v "$c")"
      break
    fi
  done
fi
if [[ -z "${PYTHON_BIN}" ]]; then
  echo "需要 Python 3.10+（python3）" >&2
  exit 1
fi
echo "python=$PYTHON_BIN"

VENV="${INSTALL_DIR}/.venv"
if [[ ! -x "${VENV}/bin/python" ]]; then
  "$PYTHON_BIN" -m venv "$VENV"
fi
# shellcheck disable=SC1091
source "${VENV}/bin/activate"
pip install -q --upgrade pip
pip install -q websocket-client pillow edge-tts
# playwright 可选：网站浏览器自动化时再装；服务器改源码不依赖它
pip install -q playwright || true

CONFIG_DIR="${HOME}/.bailong-hands"
mkdir -p "$CONFIG_DIR"
export BAILONG_HANDS_CONFIG="$CONFIG_DIR"
export BAILONG_HANDS_CONFIRM=auto
export BAILONG_HANDS_ROOT="${BAILONG_HANDS_ROOT:-$HOME/sites}"

# seed：专属激活
if [[ -n "$INSTALL_TOKEN" ]]; then
  python - <<PY
import json
from pathlib import Path
seed = {
  "brain": "${BRAIN}",
  "install_token": "${INSTALL_TOKEN}",
  "name": "${NAME_HINT}" or None,
  "confirm_mode": "auto",
  "role": "linux_server",
}
Path("${INSTALL_DIR}/seed.json").write_text(json.dumps({k:v for k,v in seed.items() if v}, ensure_ascii=False, indent=2), encoding="utf-8")
Path("${CONFIG_DIR}/seed.json").write_text(Path("${INSTALL_DIR}/seed.json").read_text(encoding="utf-8"), encoding="utf-8")
print("seed written")
PY
fi

# 先激活一次（claim）
cd "$INSTALL_DIR"
ARGS=(--console --headless --brain "$BRAIN")
if [[ -n "$PAIR_CODE" ]]; then
  ARGS+=(--pair "$PAIR_CODE")
fi
if [[ -n "$NAME_HINT" ]]; then
  ARGS+=(--name "$NAME_HINT")
fi
# 短暂跑一下完成 claim；真正常驻交给 systemd
timeout 25s "${VENV}/bin/python" app.py "${ARGS[@]}" || true

UNIT_DIR="${HOME}/.config/systemd/user"
mkdir -p "$UNIT_DIR"
UNIT_FILE="${UNIT_DIR}/${SERVICE_NAME}.service"
cat > "$UNIT_FILE" <<EOF
[Unit]
Description=BailongHands Linux agent (莆阳手脚)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=${INSTALL_DIR}
Environment=BAILONG_HANDS_CONFIG=${CONFIG_DIR}
Environment=BAILONG_HANDS_CONFIRM=auto
Environment=BAILONG_HANDS_ROOT=${BAILONG_HANDS_ROOT:-$HOME/sites}
Environment=PYTHONUNBUFFERED=1
ExecStart=${VENV}/bin/python ${INSTALL_DIR}/app.py --console --headless --brain ${BRAIN}
Restart=always
RestartSec=5

[Install]
WantedBy=default.target
EOF

if command -v systemctl >/dev/null 2>&1; then
  systemctl --user daemon-reload || true
  systemctl --user enable --now "${SERVICE_NAME}.service" || true
  # 部分无桌面服务器需要 linger 才能用户级 systemd 常驻
  if command -v loginctl >/dev/null 2>&1; then
    loginctl enable-linger "$(id -un)" 2>/dev/null || true
  fi
  sleep 2
  systemctl --user --no-pager --full status "${SERVICE_NAME}.service" || true
else
  echo "无 systemctl：请手动常驻运行："
  echo "  cd $INSTALL_DIR && BAILONG_HANDS_CONFIRM=auto ${VENV}/bin/python app.py --console --headless"
  nohup env BAILONG_HANDS_CONFIG="$CONFIG_DIR" BAILONG_HANDS_CONFIRM=auto \
    "${VENV}/bin/python" "${INSTALL_DIR}/app.py" --console --headless --brain "$BRAIN" \
    >"${CONFIG_DIR}/hands.out" 2>&1 &
  echo $! >"${CONFIG_DIR}/hands.pid"
fi

echo "完成：Linux 手脚已安装并尝试上线"
echo "工作区默认: ${BAILONG_HANDS_ROOT:-$HOME/sites}（可用环境变量改）"
echo "日志: ${CONFIG_DIR}/hands.log"
