#!/bin/bash

# 应用信息
APP_NAME="fntermx"
LOG_FILE="${TRIM_PKGVAR}/${APP_NAME}.log"
PID_FILE="${TRIM_PKGVAR}/${APP_NAME}.pid"

# 确保日志目录存在
mkdir -p "$(dirname "${LOG_FILE}")"

# 日志函数
log_msg() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "${LOG_FILE}"
}

# 检查进程是否在运行
check_process() {
    local pid=$1
    if [ -z "${pid}" ]; then
        return 1
    fi

    if ps -p "${pid}" > /dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}

# 检查应用状态
status() {
    if [ -f "${PID_FILE}" ]; then
        local pid
        pid=$(cat "${PID_FILE}" 2>/dev/null)
        if check_process "${pid}"; then
            log_msg "${APP_NAME} 正在运行 (PID: ${pid})"
            return 0
        else
            log_msg "${APP_NAME} 进程已停止，但 PID 文件存在 (PID: ${pid})"
            rm -f "${PID_FILE}"
            return 1
        fi
    else
        log_msg "${APP_NAME} 未运行"
        return 3
    fi
}

# 启动应用
start_process() {
    if status; then
        log_msg "${APP_NAME} 已经在运行"
        return 0
    fi

    log_msg "正在启动 ${APP_NAME}..."

    # 检查并配置 tmux
    TMUX_BIN="${TRIM_APPDEST}/server/bin/tmux"
    if [ -x "${TMUX_BIN}" ]; then
        # 设置共享库路径，优先使用项目自带的库
        export LD_LIBRARY_PATH="${TRIM_APPDEST}/server/lib:${LD_LIBRARY_PATH}"
        export PATH="${TRIM_APPDEST}/server/bin:${PATH}"
        log_msg "使用内置 tmux: ${TMUX_BIN}"
        log_msg "共享库路径: ${TRIM_APPDEST}/server/lib"
        # 验证 tmux 是否能正常运行
        if ${TMUX_BIN} -V >> "${LOG_FILE}" 2>&1; then
            log_msg "tmux 版本: $(${TMUX_BIN} -V)"
        else
            log_msg "⚠️  警告: tmux 启动测试失败，可能缺少依赖库"
        fi
    else
        # 使用系统 tmux
        if ! command -v tmux &> /dev/null; then
            log_msg "❌ 错误: tmux 未安装且项目未包含 tmux 二进制"
            log_msg "请安装 tmux: apt-get install tmux 或 yum install tmux"
            return 1
        fi
        log_msg "使用系统 tmux: $(which tmux) ($(tmux -V))"
    fi

    # 检查 sshpass（远程终端需要）
    SSHPASS_BIN="${TRIM_APPDEST}/server/bin/sshpass"
    if [ -x "${SSHPASS_BIN}" ]; then
        export PATH="${TRIM_APPDEST}/server/bin:${PATH}"
        log_msg "✅ 使用内置 sshpass: ${SSHPASS_BIN}"
    else
        # 检查系统是否有 sshpass
        if command -v sshpass &> /dev/null; then
            log_msg "使用系统 sshpass: $(which sshpass)"
        else
            log_msg "⚠️  警告: sshpass 未安装，远程终端密码认证将不可用"
            log_msg "   建议安装: apt-get install sshpass 或 yum install sshpass"
        fi
    fi

    # 启动二进制应用（无需 Python 环境）
    (
        # 设置环境变量
        export PATH="${TRIM_APPDEST}/server/bin:${PATH}"
        export LD_LIBRARY_PATH="${TRIM_APPDEST}/server/lib:${LD_LIBRARY_PATH}"

        # 启动二进制应用
        cd "${TRIM_APPDEST}/server" || exit 1
        ./fntermx
    ) >> "${LOG_FILE}" 2>&1 &

    # 保存进程ID
    echo $! > "${PID_FILE}"
    log_msg "${APP_NAME} 已启动 (PID: $(cat "${PID_FILE}"))"
    return 0
}

# 停止应用
stop_process() {
    log_msg "正在停止 ${APP_NAME}..."

    if [ -f "${PID_FILE}" ]; then
        local pid
        pid=$(cat "${PID_FILE}" 2>/dev/null)

        if [ -n "${pid}" ] && check_process "${pid}"; then
            log_msg "正在停止进程 (PID: ${pid})..."
            kill -TERM "${pid}" 2>/dev/null || kill -9 "${pid}" 2>/dev/null

            # 等待进程结束
            local count=0
            while check_process "${pid}" && [ $count -lt 10 ]; do
                sleep 1
                count=$((count + 1))
                log_msg "等待进程结束... (${count}s/10s)"
            done

            if check_process "${pid}"; then
                log_msg "强制终止进程 (PID: ${pid})..."
                kill -9 "${pid}" 2>/dev/null
            fi
        fi

        rm -f "${PID_FILE}"
        log_msg "${APP_NAME} 已停止"
    else
        log_msg "${APP_NAME} 未运行"
    fi
}

# 重启应用
restart_process() {
    stop_process
    sleep 2
    start_process
}

# 主逻辑
case "$1" in
    start)
        start_process
        ;;
    stop)
        stop_process
        ;;
    restart)
        restart_process
        ;;
    status)
        if status; then
            exit 0
        else
            exit 3
        fi
        ;;
    *)
        echo "使用方法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0