#!/bin/bash
# ============================================================================
#  sysmon.sh —— 启动/附着控制台监控面板
#    tmux 会话 "sysmon" 两个窗口：
#      OVERVIEW : 顶部状态栏（sysmon-status.sh，8 行） + btop（下方，自适应）
#      GPU      : nvtop（GPU 利用率/显存/温度/进程）
#    退出面板：Ctrl-b d（脱离 tmux，回到普通 shell 提示符）
#    彻底停用：sysmon-disable（下次登录不再自动进入）
# ============================================================================
set -u
SESSION=sysmon
STATUS_BIN=/usr/local/bin/sysmon-status.sh
BTOP_BIN=$(command -v btop || echo /opt/btop/bin/btop)
NVTOP_BIN=$(command -v nvtop || true)

# 控制台不熄屏 / 不省电（仅对真实 console 有效）
if [ -t 1 ]; then setterm -blank 0 -powerdown 0 -powersave off >/dev/null 2>&1 || true; fi

# 已存在则直接附着
if tmux has-session -t "$SESSION" 2>/dev/null; then
    tmux attach -t "$SESSION"
    exit $?
fi

# 各窗格命令：崩了就 2s 后自愈重启
if [ -x "$BTOP_BIN" ]; then
    BTOP_CMD="while :; do $BTOP_BIN; sleep 2; done"
else
    BTOP_CMD="while :; do top -d 3; sleep 2; done"
fi
if [ -n "$NVTOP_BIN" ]; then
    GPU_CMD="while :; do $NVTOP_BIN; sleep 2; done"
else
    GPU_CMD="while :; do nvidia-smi; sleep 3; done"
fi

# 不读用户 tmux 配置，保证面板形态稳定
# 注意：tmux 的 pane 序号按「位置」编（0=最上），故 0=顶部状态栏、1=btop
tmux -f /dev/null new-session -d -s "$SESSION" -n OVERVIEW "$BTOP_CMD"
tmux split-window -t "$SESSION:OVERVIEW" -vb -l 8 "$STATUS_BIN"
tmux select-pane -t "$SESSION:OVERVIEW.1"   # 默认焦点给下方的 btop
tmux new-window -t "$SESSION" -n GPU "$GPU_CMD"
tmux select-window -t "$SESSION:OVERVIEW"

tmux set-option -t "$SESSION" status-interval 5
tmux set-option -t "$SESSION" status-left " #[bold]sysmon#[nobold] "
tmux set-option -t "$SESSION" status-right " Ctrl-b n:GPU  Ctrl-b d:quit  %H:%M "
tmux set-option -t "$SESSION" mouse on
tmux set-option -t "$SESSION" set-titles on
# 窗口真实尺寸只有客户端附着后才知道：附着后把顶部状态栏固定为 8 行，
# 之后每次客户端尺寸变化（换显示器/改分辨率）由 hook 重新固定。
tmux set-hook -t "$SESSION" client-resized \
    "resize-pane -t $SESSION:OVERVIEW.0 -y 8" 2>/dev/null || true
( sleep 3; tmux resize-pane -t "$SESSION:OVERVIEW.0" -y 8 2>/dev/null ) &

tmux attach -t "$SESSION"
