#!/bin/bash
CONFIG="/var/www/html/config.json"

green()  { echo -e "\033[32m$1\033[0m"; }
red()    { echo -e "\033[31m$1\033[0m"; }
yellow() { echo -e "\033[33m$1\033[0m"; }
cyan()   { echo -e "\033[36m$1\033[0m"; }

show_menu() {
    clear
    echo ""
    cyan "╔══════════════════════════════════════════╗"
    cyan "║        监 控 面 板 · 节 点 管 理 器        ║"
    cyan "╚══════════════════════════════════════════╝"
    echo ""
    python3 -c "
import json
cfg = json.load(open('$CONFIG'))
servers = cfg['servers']
if not servers:
    print('  （暂无节点）')
else:
    for i, s in enumerate(servers, 1):
        print(f'  {i}. {s[\"name\"]}  |  {s[\"ip\"]}:{s[\"port\"]}')
print(f'\n  共 {len(servers)} 个节点')
"
    echo ""
    cyan "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "  1. 新增节点"
    echo "  2. 删除节点"
    echo "  3. 修改节点名称"
    echo "  4. 检查所有节点状态"
    echo "  5. 重启面板"
    echo "  6. 查看面板日志"
    echo "  0. 退出"
    cyan "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo ""
}

add_node() {
    clear
    echo ""
    cyan "╔══════════════════════════════════════════╗"
    cyan "║             新 增 节 点                    ║"
    cyan "╚══════════════════════════════════════════╝"
    echo ""
    read -p "  节点名称: " name
    read -p "  IP 地址: " ip
    read -p "  SSH 端口: " port
    read -p "  用户名: " user
    read -s -p "  密码: " pass
    echo ""
    echo ""
    python3 -c "
import json, sys
f, name, ip, port, user, pwd = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6]
cfg = json.load(open(f))
cfg['servers'].append({'name': name, 'ip': ip, 'port': int(port), 'user': user, 'password': pwd})
json.dump(cfg, open(f,'w'), indent=2, ensure_ascii=False)
print(f'  ✔ 已添加: {name} ({ip}:{port})')
" "$CONFIG" "$name" "$ip" "$port" "$user" "$pass"
    echo ""
    echo -n "  是否立即重启面板使其生效？(y/n): "
    read ch
    if [ "$ch" = "y" ] || [ "$ch" = "Y" ]; then restart_panel; fi
    read -p "  按回车返回菜单..."
}

del_node() {
    clear
    echo ""
    cyan "╔══════════════════════════════════════════╗"
    cyan "║             删 除 节 点                    ║"
    cyan "╚══════════════════════════════════════════╝"
    echo ""
    python3 -c "
import json
cfg = json.load(open('$CONFIG'))
for i, s in enumerate(cfg['servers'], 1):
    print(f'  {i}. {s[\"name\"]}  |  {s[\"ip\"]}:{s[\"port\"]}')
"
    echo ""
    read -p "  输入要删除的节点编号: " num
    python3 -c "
import json, sys
f = sys.argv[1]; num = int(sys.argv[2]) - 1
cfg = json.load(open(f))
if 0 <= num < len(cfg['servers']):
    name = cfg['servers'][num]['name']
    del cfg['servers'][num]
    json.dump(cfg, open(f,'w'), indent=2, ensure_ascii=False)
    print(f'  ✔ 已删除: {name}')
else:
    print('  ❌ 编号无效'); sys.exit(1)
" "$CONFIG" "$num"
    if [ $? -eq 0 ]; then
        echo ""
        echo -n "  是否立即重启面板使其生效？(y/n): "
        read ch
        if [ "$ch" = "y" ] || [ "$ch" = "Y" ]; then restart_panel; fi
    fi
    read -p "  按回车返回菜单..."
}

rename_node() {
    clear
    echo ""
    cyan "╔══════════════════════════════════════════╗"
    cyan "║           修 改 节 点 名 称                ║"
    cyan "╚══════════════════════════════════════════╝"
    echo ""
    python3 -c "
import json
cfg = json.load(open('$CONFIG'))
for i, s in enumerate(cfg['servers'], 1):
    print(f'  {i}. {s[\"name\"]}  |  {s[\"ip\"]}:{s[\"port\"]}')
"
    echo ""
    read -p "  选择要修改的节点编号: " num
    python3 -c "
import json, sys
cfg = json.load(open(sys.argv[1]))
idx = int(sys.argv[2]) - 1
if 0 <= idx < len(cfg['servers']):
    print(cfg['servers'][idx]['name'])
else:
    sys.exit(1)
" "$CONFIG" "$num" > /tmp/_old_name.txt 2>/dev/null
    if [ $? -ne 0 ]; then
        red "  ❌ 编号无效"
        read -p "  按回车返回菜单..."
        return
    fi
    old_name=$(cat /tmp/_old_name.txt)
    yellow "  当前名称: $old_name"
    read -p "  输入新名称: " new_name
    if [ -z "$new_name" ]; then
        red "  ❌ 名称不能为空"
        read -p "  按回车返回菜单..."
        return
    fi
    python3 -c "
import json, sys
f = sys.argv[1]; old = sys.argv[2]; new = sys.argv[3]; idx = int(sys.argv[4]) - 1
cfg = json.load(open(f))
cfg['servers'][idx]['name'] = new
json.dump(cfg, open(f,'w'), indent=2, ensure_ascii=False)
print(f'  ✔ {old} → {new}')
" "$CONFIG" "$old_name" "$new_name" "$num"
    rm -f /tmp/_old_name.txt
    echo ""
    echo -n "  是否立即重启面板使其生效？(y/n): "
    read ch
    if [ "$ch" = "y" ] || [ "$ch" = "Y" ]; then restart_panel; fi
    read -p "  按回车返回菜单..."
}

check_all() {
    python3 /var/www/html/check_nodes.py
    read -p "  按回车返回菜单..."
    return
    #以下代码已废弃
    clear
    echo ""
    cyan "╔══════════════════════════════════════════╗"
    cyan "║           检 查 所 有 节 点                 ║"
    cyan "╚══════════════════════════════════════════╝"
    # 用临时文件存列表，避免管道子shell问题
    local tmpfile
    tmpfile=$(mktemp)
    python3 -c "
import json
cfg = json.load(open('$CONFIG'))
for i, s in enumerate(cfg['servers'], 1):
    print(f'{i}|{s[\"name\"]}|{s[\"ip\"]}|{s[\"port\"]}|{s[\"user\"]}|{s[\"password\"]}')
" > "$tmpfile"
    # 用进程替换读取，不会被ssh错误中断
    while IFS='|' read -r idx name ip port user pass; do
        [ -z "$idx" ] && continue
        echo ""
        yellow "--- [$idx] $name ($ip:$port) ---"
        echo -n "  SSH 连接: "
        set +e
        sshpass -p "$pass" ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -p "$port" "$user@$ip" "echo ok" >/dev/null 2>&1
        [ $? -eq 0 ] && green "正常" || red "失败"
        echo -n "  vnstat 组件: "
        vn=$(sshpass -p "$pass" ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -p "$port" "$user@$ip" "vnstat --version 2>/dev/null | head -1" 2>/dev/null)
        echo "$vn" | grep -qi "vnstat" && green "已安装" || red "未安装"
        echo -n "  vnstat 服务: "
        st=$(sshpass -p "$pass" ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -p "$port" "$user@$ip" "systemctl is-active vnstat 2>/dev/null" 2>/dev/null)
        [ "$st" = "active" ] && green "运行中" || red "未运行"
        set -e
    done < "$tmpfile"
    rm -f "$tmpfile"
    echo ""
    cyan "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    read -p "  按回车返回菜单..."
}

restart_panel() {
    echo ""
    yellow "  正在重启面板..."
    systemctl restart traffic-web.service
    sleep 2
    systemctl is-active --quiet traffic-web.service && green "  ✔ 面板已重启" || red "  ❌ 面板启动失败"
    echo ""
}

show_log() {
    clear
    echo ""
    cyan "╔══════════════════════════════════════════╗"
    cyan "║            面 板 运 行 日 志                ║"
    cyan "╚══════════════════════════════════════════╝"
    echo ""
    journalctl -u traffic-web.service --no-pager -n 30 2>/dev/null || tail -30 /tmp/panel.log 2>/dev/null || yellow "  暂无日志"
    echo ""
    cyan "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    read -p "  按回车返回菜单..."
}

while true; do
    show_menu
    read -p "  请选择操作: " choice
    case $choice in
        1) add_node ;;
        2) del_node ;;
        3) rename_node ;;
        4) check_all ;;
        5) restart_panel && read -p "  按回车返回菜单..." ;;
        6) show_log ;;
        0) clear; echo ""; green "  再见！"; echo ""; exit 0 ;;
        *) yellow "  无效选项，请重新选择"; sleep 1 ;;
    esac
done
