#!/bin/bash
# start-all.sh — 起晒所有 services（nohup，唔靠 systemd）＋ keep loop。
# 全部 port／path／URL 由 env.sh 出（唔喺本檔寫死）；X display 1408x2700 令三個 browser（外框 1408x900）可以上中下。
# VNC 鏈（主持 8578）：X 伺服器 → VNC 出口 → websockify → reverse tunnel；VNC_MODE 揀 Xvnc 定 Xvfb＋x11vnc。
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
[ -f "$HERE/env.sh" ] || { echo "❌ 未設 env.sh（copy env.sh.example 做 env.sh 改你嘅值）"; exit 2; }
. "$HERE/env.sh"
mkdir -p "$ARENA_HOME/logs" "$ARENA_HOME/run" "$ARENA_HOME/local-profiles"   # logs 先建：未套 hardening 嘅 watcher 靠呢個目錄

echo "=== 0. 前置檢查 ==="
[ -x "$VENV/bin/python" ] || { echo "❌ venv 唔見（跑 setup.sh）"; exit 2; }
"$VENV/bin/python" -c "import playwright" || { echo "❌ venv 冇 playwright（跑 setup.sh）"; exit 2; }
[ -f "$SSH_WRAPPER" ] || echo "⚠️ 冇 ssh wrapper（$SSH_WRAPPER）→ tunnel 會起唔到，請先設定"

echo "=== 1. VNC 出口 $DISPLAY（mode=${VNC_MODE:-xvnc}，${SCREEN_W}x${SCREEN_H}，RFB $RFB_PORT，只綁 localhost）==="
if [ "${VNC_MODE:-xvnc}" = "xvfb_x11vnc" ]; then
  pkill -f "${XVFB_BIN:-Xvfb} $DISPLAY" 2>/dev/null || true
  pkill -f "${X11VNC_BIN:-x11vnc} -display $DISPLAY" 2>/dev/null || true; sleep 1
  nohup "${XVFB_BIN:-Xvfb}" "$DISPLAY" -screen 0 "${SCREEN_W}x${SCREEN_H}x24" \
        > "$ARENA_HOME/logs/xvfb.log" 2>&1 &
  sleep 2
  nohup "${X11VNC_BIN:-x11vnc}" -display "$DISPLAY" -rfbport "$RFB_PORT" -localhost -forever -shared -nopw \
        ${X11VNC_EXTRA:-} > "$ARENA_HOME/logs/x11vnc.log" 2>&1 &
  sleep 2
else
  pkill -f "Xvnc $DISPLAY" 2>/dev/null || true; sleep 1
  nohup Xvnc "$DISPLAY" -geometry "${SCREEN_W}x${SCREEN_H}" -depth 24 -rfbport "$RFB_PORT" \
        -SecurityTypes None -localhost > "$ARENA_HOME/logs/xvnc.log" 2>&1 &
  sleep 3
fi

echo "=== 2. websockify 127.0.0.1:$WS_PORT → 127.0.0.1:$RFB_PORT ==="
pkill -f "websockify.*$WS_PORT" 2>/dev/null || true; sleep 1
nohup "$VENV/bin/python" -m websockify "127.0.0.1:$WS_PORT" "127.0.0.1:$RFB_PORT" \
      > "$ARENA_HOME/logs/websockify.log" 2>&1 &
sleep 2

echo "=== 3. reverse tunnel（ExitOnForwardFailure=yes；PID 檔驗生死）==="
PIDF="$ARENA_HOME/run/tunnel.pid"
if [ -f "$PIDF" ] && kill -0 "$(cat "$PIDF")" 2>/dev/null; then
  echo "tunnel 已在生（PID $(cat "$PIDF")）"
else
  nohup "$SSH_WRAPPER" -o ExitOnForwardFailure=yes -o ServerAliveInterval=15 -o ServerAliveCountMax=3 \
        -N -R "127.0.0.1:$TUNNEL_PORT:localhost:$WS_PORT" > "$ARENA_HOME/logs/tunnel.log" 2>&1 &
  echo $! > "$PIDF"; sleep 3
fi

echo "=== 4. 排位（y=0/900/1800）＋ watchers ＋ keep loop ==="
bash "$HERE/place-windows.sh" || true
bash "$HERE/start-watcher.sh" || true
KPID="$ARENA_HOME/run/keep.pid"
if [ -f "$KPID" ] && kill -0 "$(cat "$KPID")" 2>/dev/null; then echo "keep 已在生"; else
  nohup bash "$HERE/vnc-keep.sh" >> "$ARENA_HOME/logs/keep.log" 2>&1 &
fi

echo ""
echo "=== 完成（未開始登入；第一次要人手 VNC 登入）==="
echo "VNC: http://${SERVER_HOST}:${SERVER_WEB_PORT}/vnc.html?autoconnect=true&path=$VNC_PATH"
echo "ℹ️  呢條 URL 由 env.sh 出（path/port 唔再寫死）；如 server 域名／port 唔同，改 env.sh。"
