#!/bin/bash
# ================================================================
# QHPanel Agent CLI - 配置与管理工具
# ================================================================
# 用法:
#   qh                        # 显示状态
#   qh status                 # 显示详细状态
#   qh set <key> <val>        # 修改配置（重启生效）
#   qh restart                # 重启服务
#   qh logs [N]               # 查看最近 N 行日志（默认 30）
#   qh version                # 显示版本
#   qh sw                     # 列出可安装的软件
#   qh sw versions <name>     # 查看软件可用版本
#   qh sw install <name> [ver]# 安装软件
#   qh sw uninstall <name>    # 卸载软件
#   qh sw installed           # 列出已安装软件
#   qh site                   # 列出 Nginx 站点
#   qh site create <domain> [port] [type] # 创建站点
#   qh site delete <domain>   # 删除站点
#   qh site info <domain>     # 查看站点详情
# ================================================================

set -e

# ── 跨平台路径 ──
if [ "$(uname)" = "Darwin" ]; then
    INSTALL_DIR="$HOME/qhpanel/server/panel"
    SERVICE_NAME="com.qhpanel.agent"
    LOG_DIR="$HOME/qhpanel/logs"
    IS_MACOS=1
else
    INSTALL_DIR="/qhpanel/server/panel"
    SERVICE_NAME="qhpanel-agent"
    LOG_DIR="/var/log/qhpanel-agent"
    IS_MACOS=0
fi
ENV_FILE="$INSTALL_DIR/.env"

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# ─────────────────────────────────────────────
# 辅助函数
# ─────────────────────────────────────────────

_get_env_val() {
    local key="$1"
    grep "^${key}=" "$ENV_FILE" 2>/dev/null | head -1 | cut -d'=' -f2-
}

_get_version() {
    # 优先从 VERSION 文件读取，兜底 config.py
    if [ -f "$INSTALL_DIR/VERSION" ]; then
        grep '^version=' "$INSTALL_DIR/VERSION" | cut -d'=' -f2
    elif [ -f "$INSTALL_DIR/agent/config.py" ]; then
        grep 'AGENT_VERSION' "$INSTALL_DIR/agent/config.py" | head -1 | sed 's/.*"\(.*\)".*/\1/'
    else
        echo "unknown"
    fi
}

_check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误：需要 root 权限，请使用 sudo qh${NC}" >&2
        exit 1
    fi
}

# ─────────────────────────────────────────────
# 子命令实现
# ─────────────────────────────────────────────

cmd_status() {
    local version=$(_get_version)
    local server_url=$(_get_env_val "SERVER_URL")
    local token=$(_get_env_val "AGENT_TOKEN")
    local hostname=$(_get_env_val "HOSTNAME")
    [ -z "$hostname" ] && hostname=$(hostname)

    echo -e "${CYAN}═══ QHPanel Agent 状态 ═══${NC}"
    echo ""
    echo -e "  版本:     ${GREEN}${version}${NC}"
    echo -e "  主机名:   ${hostname}"
    echo -e "  Server:   ${server_url:-未配置}"
    if [ -n "$token" ]; then
        echo -e "  Token:    ${token:0:8}..."
    else
        echo -e "  Token:    ${RED}未配置${NC}"
    fi
    echo ""

    # 服务状态
    if [ "$IS_MACOS" = "1" ]; then
        if launchctl list 2>/dev/null | grep -q "$SERVICE_NAME"; then
            local pid=$(launchctl list 2>/dev/null | grep "$SERVICE_NAME" | awk '{print $1}')
            if [ "$pid" != "-" ] && [ -n "$pid" ]; then
                echo -e "  服务:     ${GREEN}● 运行中${NC}"
                echo -e "  PID:      $pid"
            else
                echo -e "  服务:     ${RED}● 已停止${NC}"
            fi
        else
            echo -e "  服务:     ${RED}● 未安装${NC}"
        fi
        # 从日志文件读取最近事件
        local latest_log=$(tail -50 "$LOG_DIR/agent.stdout.log" 2>/dev/null | grep -E "Connected|Disconnected|Error" | tail -1)
    else
        if systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null; then
            echo -e "  服务:     ${GREEN}● 运行中${NC}"
            local pid=$(systemctl show -p MainPID --value "$SERVICE_NAME" 2>/dev/null)
            [ -n "$pid" ] && [ "$pid" != "0" ] && echo -e "  PID:      $pid"
        else
            echo -e "  服务:     ${RED}● 已停止${NC}"
        fi
        local latest_log=$(journalctl -u "$SERVICE_NAME" --no-pager -n 50 2>/dev/null | grep -E "Connected|Disconnected|Error" | tail -1)
    fi
    if [ -n "$latest_log" ]; then
        echo -e "  最近事件: $latest_log"
    fi

    echo ""
}

cmd_set() {
    if [ "$IS_MACOS" = "1" ]; then
        : # macOS 不需要 root
    else
        _check_root
    fi
    local key="${1^^}"  # 转大写
    local val="$2"

    if [ -z "$key" ] || [ -z "$val" ]; then
        echo "用法: sudo qh set <KEY> <VALUE>"
        echo ""
        echo "可用配置项:"
        echo "  SERVER_URL    面板 WebSocket 地址 (如 wss://panel.example.com/ws/agent)"
        echo "  AGENT_TOKEN   Agent 认证令牌"
        echo "  HOSTNAME      主机名标识（默认系统主机名）"
        echo "  QHW_URL       QHW 分发站地址（默认 https://qhw.qhs.pub）"
        echo "  LOG_LEVEL     日志级别 (DEBUG/INFO/WARNING/ERROR)"
        echo ""
        echo "示例:"
        echo "  sudo qh set server_url wss://panel.example.com/ws/agent"
        echo "  sudo qh set agent_token my-token-xxx"
        exit 1
    fi

    if [ ! -f "$ENV_FILE" ]; then
        echo -e "${RED}错误: $ENV_FILE 不存在${NC}" >&2
        exit 1
    fi

    # 更新或追加
    if grep -q "^${key}=" "$ENV_FILE"; then
        if [ "$IS_MACOS" = "1" ]; then
            sed -i '' "s|^${key}=.*|${key}=${val}|" "$ENV_FILE"
        else
            sed -i "s|^${key}=.*|${key}=${val}|" "$ENV_FILE"
        fi
    else
        echo "${key}=${val}" >> "$ENV_FILE"
    fi

    echo -e "${GREEN}✓ ${key}=${val}${NC}"
    echo "  重启服务生效: sudo qh restart"
}

cmd_restart() {
    if [ "$IS_MACOS" = "0" ]; then
        _check_root
    fi
    echo "  重启 Agent..."
    if [ "$IS_MACOS" = "1" ]; then
        launchctl unload "$HOME/Library/LaunchAgents/$SERVICE_NAME.plist" 2>/dev/null
        # 杀掉残留进程
        lsof -ti:9911 | xargs kill -9 2>/dev/null
        sleep 1
        launchctl load -w "$HOME/Library/LaunchAgents/$SERVICE_NAME.plist"
        sleep 1
        if launchctl list 2>/dev/null | grep -q "$SERVICE_NAME"; then
            echo -e "  ${GREEN}✓ 服务已启动${NC}"
        else
            echo -e "  ${RED}✗ 启动失败，查看日志: qh logs${NC}"
        fi
    else
        systemctl restart "$SERVICE_NAME"
        sleep 1
        if systemctl is-active --quiet "$SERVICE_NAME"; then
            echo -e "  ${GREEN}✓ 服务已启动${NC}"
        else
            echo -e "  ${RED}✗ 启动失败，查看日志: sudo qh logs${NC}"
        fi
    fi
}

cmd_logs() {
    local lines="${1:-30}"
    echo -e "${CYAN}═══ Agent 最近 ${lines} 行日志 ═══${NC}"
    echo ""
    if [ "$IS_MACOS" = "1" ]; then
        tail -n "$lines" "$LOG_DIR/agent.stdout.log" 2>/dev/null \
            || echo "  无日志文件 ($LOG_DIR/agent.stdout.log)"
    else
        journalctl -u "$SERVICE_NAME" --no-pager -n "$lines" --output=short-precise 2>/dev/null \
            || echo "  无法读取日志（服务可能未安装）"
    fi
}

cmd_version() {
    echo "qhpanel-agent $(_get_version)"
}

# ── Python helper 调用 ──
HELPER="$INSTALL_DIR/qh_helper.py"
VENV_PYTHON="$INSTALL_DIR/venv/bin/python"

_run_helper() {
    if [ ! -f "$HELPER" ]; then
        echo -e "${RED}错误: helper 脚本不存在 ($HELPER)${NC}" >&2
        echo "  请重新安装 Agent: curl -sSL https://qhw.qhs.pub/agent/install.sh | sudo bash" >&2
        exit 1
    fi
    "$VENV_PYTHON" "$HELPER" "$@"
}

cmd_sw() {
    local sub="${2:-list}"
    case "$sub" in
        list|"")    _run_helper sw-list ;;
        versions)   _run_helper sw-versions "$3" ;;
        install)    _check_root; _run_helper sw-install "$3" "$4" ;;
        uninstall)  _check_root; _run_helper sw-uninstall "$3" ;;
        installed)  _run_helper sw-installed ;;
        *)
            echo "用法: qh sw [命令]"
            echo ""
            echo "  qh sw                   列出可安装的软件"
            echo "  qh sw versions <name>   查看软件可用版本"
            echo "  qh sw install <name> [ver] 安装软件"
            echo "  qh sw uninstall <name>  卸载软件"
            echo "  qh sw installed         列出已安装软件"
            ;;
    esac
}

cmd_site() {
    local sub="${2:-list}"
    case "$sub" in
        list|"")    _run_helper site-list ;;
        create)     _check_root; _run_helper site-create "$3" "$4" "$5" ;;
        delete)     _check_root; _run_helper site-delete "$3" ;;
        info)       _run_helper site-info "$3" ;;
        *)
            echo "用法: qh site [命令]"
            echo ""
            echo "  qh site                     列出 Nginx 站点"
            echo "  qh site create <domain> [port] [type]  创建站点"
            echo "  qh site delete <domain>     删除站点"
            echo "  qh site info <domain>       查看站点详情"
            ;;
    esac
}

# ─────────────────────────────────────────────
# 主入口
# ─────────────────────────────────────────────

case "${1:-status}" in
    status)   cmd_status ;;
    set)      cmd_set "$2" "$3" ;;
    restart)  cmd_restart ;;
    logs)     cmd_logs "$2" ;;
    version)  cmd_version ;;
    sw|soft|software) cmd_sw "$@" ;;
    site|sites)       cmd_site "$@" ;;
    -h|--help|help)
        echo "QHPanel Agent CLI"
        echo ""
        echo "用法: qh [命令] [参数]"
        echo ""
        echo "基础命令:"
        echo "  status              显示 Agent 状态（默认）"
        echo "  set <K> <V>         修改配置（需 sudo）"
        echo "  restart             重启服务（需 sudo）"
        echo "  logs [N]            查看最近 N 行日志（默认 30）"
        echo "  version             显示版本号"
        echo ""
        echo "软件管理:"
        echo "  sw                  列出可安装的软件"
        echo "  sw versions <name>  查看软件可用版本"
        echo "  sw install <name> [ver]  安装软件（需 sudo）"
        echo "  sw uninstall <name>      卸载软件（需 sudo）"
        echo "  sw installed        列出已安装软件"
        echo ""
        echo "站点管理 (Nginx):"
        echo "  site                列出所有站点"
        echo "  site create <domain> [port] [type]  创建站点（需 sudo）"
        echo "  site delete <domain>    删除站点（需 sudo）"
        echo "  site info <domain>      查看站点详情"
        echo ""
        ;;
    *)
        echo -e "${RED}未知命令: $1${NC}" >&2
        echo "运行 'qh help' 查看可用命令" >&2
        exit 1
        ;;
esac
