#!/bin/bash

# ============================================================
# noVNC 启动脚本
# 启动 Xtigervnc :1 + 单实例 websockify :6080
# 防重复启动，自动检查依赖
# ============================================================

echo "========== 启动 noVNC 服务 =========="

# ---------- 1. 检查密码 ----------
if [ ! -f /root/.vnc/passwd ]; then
    echo "❌ VNC 密码未设置，请先运行: vncpasswd"
    exit 1
fi

# ---------- 2. 检查 xstartup ----------
if [ ! -f /root/.vnc/xstartup ]; then
    echo "❌ xstartup 未配置，请先运行: ./setup-novnc.sh"
    exit 1
fi

# ---------- 3. 检查 index.html 软链 ----------
NOVNC_WEB_DIR="/usr/share/novnc"
if [ -d "$NOVNC_WEB_DIR" ] && [ ! -e "$NOVNC_WEB_DIR/index.html" ]; then
    echo "⚠️  index.html 软链缺失，修复中..."
    cd "$NOVNC_WEB_DIR" && ln -sf vnc.html index.html
    echo "  ✅ 已修复"
fi

# ---------- 4. 启动 Xtigervnc :1 ----------
echo ""
echo "[1/2] 检查 Xtigervnc..."
if pgrep -x Xtigervnc >/dev/null 2>&1; then
    echo "  ⏭️ Xtigervnc 已在运行，跳过"
else
    echo "  启动 Xtigervnc :1 (1280x720, 仅本地监听)..."
    # 清理残留的锁文件
    rm -f /tmp/.X1-lock /tmp/.X11-unix/X1 2>/dev/null
    # 启动 VNC（-localhost=1 确保只绑 127.0.0.1）
    vncserver :1 \
        -localhost yes \
        -geometry 1280x720 \
        -depth 24 \
        > /tmp/vnc_startup.log 2>&1
    sleep 2
    if pgrep -x Xtigervnc >/dev/null 2>&1; then
        echo "  ✅ Xtigervnc 已启动 (PID: $(pgrep -x Xtigervnc | head -1))"
    else
        echo "  ❌ Xtigervnc 启动失败，日志："
        cat /tmp/vnc_startup.log
        exit 1
    fi
fi

# ---------- 5. 启动 websockify（单实例）----------
echo ""
echo "[2/2] 检查 websockify..."
# 统计当前监听 6080 的 websockify 实例数
WS_COUNT=$(pgrep -fc "websockify.*6080" 2>/dev/null || echo 0)
if [ "$WS_COUNT" -gt 0 ]; then
    echo "  ⏭️ websockify 已在运行（$WS_COUNT 个实例），跳过"
    if [ "$WS_COUNT" -gt 1 ]; then
        echo "  ⚠️  检测到多个实例（$WS_COUNT），建议清理后重启："
        echo "     pkill -f 'websockify.*6080' && ./start-novnc.sh"
    fi
else
    echo "  启动 websockify :6080 → localhost:5901..."
    nohup websockify --web "$NOVNC_WEB_DIR" 6080 localhost:5901 \
        > /tmp/websockify.log 2>&1 &
    sleep 2
    if ss -ltnp 2>/dev/null | grep -q ':6080'; then
        echo "  ✅ websockify 已启动 :6080"
    else
        echo "  ❌ websockify 启动失败，日志："
        cat /tmp/websockify.log
        exit 1
    fi
fi

# ---------- 6. 验证 ----------
echo ""
echo "========== 服务状态验证 =========="
echo ""
echo "VNC 端口（5901，仅本地）："
ss -ltnp 2>/dev/null | grep ':5901' || echo "  ❌ 5901 未监听"
echo ""
echo "noVNC 端口（6080，对外开放）："
ss -ltnp 2>/dev/null | grep ':6080' || echo "  ❌ 6080 未监听"
echo ""

# 本地页面验证
echo "本地页面测试："
PAGE=$(curl -s --max-time 5 http://localhost:6080/ 2>/dev/null | head -3)
if echo "$PAGE" | grep -q "noVNC\|DOCTYPE"; then
    echo "  ✅ noVNC 页面正常"
else
    echo "  ❌ 页面异常，返回内容："
    echo "$PAGE"
    echo ""
    echo "  如果显示目录列表，运行："
    echo "    cd /usr/share/novnc && ln -sf vnc.html index.html"
fi

echo ""
echo "========== 启动完成 =========="
echo ""
echo "本地访问：http://localhost:6080/"
echo "公网暴露：运行 ./expose-novnc.sh"
echo ""
