#!/bin/bash
# 资源监控台 FPK —— 生命周期管理
# start / stop / status

set -u

# ---- 调用追踪（飞牛调了哪个脚本、带了什么参数，都会记下来）----
_TR="/vol1/@appshare/zyjkw-monitor/data/logs/cmd_trace.log"
mkdir -p "$(dirname "$_TR")" 2>/dev/null || true
{ echo "==== $(date '+%Y-%m-%d %H:%M:%S') $(basename "$0") called ====";
  echo "0=$0  args=$*";
  env | grep -E '^wizard_|^TRIM_' | sed 's/^/  /'; } >> "$_TR" 2>/dev/null || true
# -------------------------------------------------------------------

_source="$(dirname "$0")/common.sh"
[ -f "$_source" ] || _source="/var/apps/zyjkw-monitor/cmd/common.sh"
. "$_source"

# 让人能看见的错误：写飞牛日志文件（应用中心会显示） + stderr
_msg() {
    echo "[zyjkw-monitor] $1" >> "${TRIM_TEMP_LOGFILE:-/dev/null}" 2>/dev/null || true
    echo "[zyjkw-monitor] $1" >&2 || true
}

start_process() {
    init_ports
    if is_running; then
        log_msg "已在运行（pid $(cat "$PID_FILE")），不重复启动"
        return 0
    fi
    kill_all_ours      # 先把本应用所有残留进程清掉（升级/重装后 PID 文件和端口都可能对不上）
    free_ports
    sleep 1

    # 端口被别的程序占着时，明确报出来（以前只会静默失败，飞牛只显示"本地应用启动失败"）
    local _occ
    _occ="$(ss -ltnp 2>/dev/null | grep -E "[:.]${HTTP_PORT}([[:space:]]|$)" \
            | sed -n 's/.*users:(("\([^"]*\)",pid=\([0-9]*\).*/\1(\2)/p' | head -1)"
    if [ -n "$_occ" ]; then
        # 占着端口的如果就是本应用的进程（PID 文件丢过），直接认领，别报错
        local _occ_pid
        _occ_pid="$(port_pid)"
        if [ -n "$_occ_pid" ]; then
            echo "$_occ_pid" > "$PID_FILE"
            log_msg "端口 ${HTTP_PORT} 上已是本应用进程 ${_occ_pid}，视为已启动"
            return 0
        fi
        log_msg "端口 ${HTTP_PORT} 已被 ${_occ} 占用，无法启动"
        _msg "端口 ${HTTP_PORT} 已被 ${_occ} 占用：请停掉另一个实例，或到「应用设置 → 运行设置」换个端口"
        return 1
    fi

    local PY
    PY="$(find_python)" || {
        log_msg "找不到 Python 3.12（依赖应用 python312 未安装？）"
        _msg "找不到 Python 3.12：请先在应用中心安装「Python 3.12」"
        return 1
    }
    local DD
    DD="$(data_dir)"
    mkdir -p "$PKGVAR" "$DD"

    local PROG
    PROG="$(program_dir)"
    cd "$PROG" || { _msg "程序目录不存在：$PROG（请重装应用）"; return 1; }
    local entry="server.pyc"
    [ -f "$entry" ] || entry="server.py"
    [ -f "$entry" ] || { _msg "找不到 server.pyc（安装包可能不完整，请重装）"; return 1; }

    # 日志轮转：var/server.log 超过 8MB 就留一份 .1，避免长期运行把磁盘吃满
    _sl="${PKGVAR}/server.log"
    if [ -f "$_sl" ]; then
        _sz=$(wc -c < "$_sl" 2>/dev/null || echo 0)
        if [ "$_sz" -gt 8388608 ] 2>/dev/null; then
            mv -f "$_sl" "${_sl}.1" 2>/dev/null || true
            : > "$_sl" 2>/dev/null || true
            log_msg "var/server.log 超 8MB，已轮转为 server.log.1"
        fi
    fi

    sync_manifest_port   # 让飞牛的详情页/打开按钮/桌面图标拿到正确端口
    log_msg "启动（python=${PY} 程序=${PROG} 数据=${DD} 端口=${HTTP_PORT}/${HTTPS_PORT}）"
    # 注意：不要传 WJK_HTTP_PORT / WJK_HTTPS_PORT。
    # 传了会被程序当成"端口由环境变量锁死"，设置页就不让改端口了。
    # 程序自己会读 <数据目录>/server_config.json，端口一样是这个值。
    WJK_DATA_DIR="$DD" \
    WJK_FPK=1 \
    TRIM_DATA_ACCESSIBLE_PATHS="${TRIM_DATA_ACCESSIBLE_PATHS:-}" \
    nohup "$PY" "$entry" >> "${PKGVAR}/server.log" 2>&1 &
    echo $! > "$PID_FILE"

    local i
    for i in $(seq 1 40); do
        sleep 1
        if ! is_running; then
            log_msg "启动失败，进程已退出，见 ${PKGVAR}/server.log"
            _msg "启动失败：$(tail -3 "${PKGVAR}/server.log" 2>/dev/null | tr '\n' ' ' | head -c 220)"
            return 1
        fi
        if command -v ss >/dev/null 2>&1 && ss -ltn 2>/dev/null | grep -qE "[:.]${HTTP_PORT}([[:space:]]|$)"; then
            log_msg "已就绪：http://0.0.0.0:${HTTP_PORT}"
            # 服务起来后再对齐一次：安装/升级过程中数据库记录可能还没写全，
            # 这时才真正能把「常规 → 访问端口」和桌面图标链接改对。
            sleep 1
            sync_manifest_port
            log_msg "端口已同步：manifest / ui-config / 飞牛数据库 → ${HTTP_PORT}"
            return 0
        fi
    done
    log_msg "进程在跑但端口未监听（可能仍在初始化），继续观察"
    return 0
}

stop_process() {
    init_ports
    if ! is_running; then
        free_ports
        log_msg "未在运行"
        return 0
    fi
    local pid
    pid="$(cat "$PID_FILE" | tr -dc '0-9')"
    log_msg "停止（pid ${pid}）"
    kill "$pid" 2>/dev/null
    local i
    for i in $(seq 1 20); do
        sleep 1
        [ -d "/proc/$pid" ] || break
    done
    if [ -d "/proc/$pid" ]; then
        log_msg "SIGTERM 超时，强杀"
        kill -9 "$pid" 2>/dev/null
    fi
    rm -f "$PID_FILE"
    kill_all_ours
    free_ports
    return 0
}

status_process() {
    if is_running; then
        local pid
        pid="$(cat "$PID_FILE" | tr -dc '0-9')"
        echo "running (pid ${pid})"
        return 0
    fi
    echo "stopped"
    return 3          # 飞牛约定：0=运行中，3=已停止（返回 1 会被当成"异常"）
}

case "${1:-}" in
    start)  init_ports; sync_manifest_port; start_process ;;
    stop)   stop_process ;;
    status) status_process ;;
    *)      echo "usage: $0 {start|stop|status}" >&2; exit 2 ;;
esac
