#!/bin/bash
# 资源监控台 —— 应用设置「运行设置」保存后应用配置
#
# ⚠️ 原则：**永远 exit 0**。任何一步失败都只记录、不报错，
#    否则飞牛会在「访问权限」等其他保存动作上弹「执行配置初始化脚本失败」。
set -u

TRACE="/vol1/@appshare/zyjkw-monitor/data/logs/cmd_trace.log"
mkdir -p "$(dirname "$TRACE")" 2>/dev/null || true
{
    echo "==== $(date '+%Y-%m-%d %H:%M:%S') config_callback called ===="
    echo "0=$0  args=$*"
    env | grep -E '^wizard_|^TRIM_' | sed 's/^/  /'
} >> "$TRACE" 2>/dev/null || true

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

LOG="${TRIM_TEMP_LOGFILE:-/dev/null}"
log() {
    echo "[zyjkw-monitor] $1" > "$LOG" 2>/dev/null
    echo "[zyjkw-monitor] $1" >> "$TRACE" 2>/dev/null
}

HP="${wizard_http_port:-}"
HS="${wizard_https_port:-}"
MODE="${wizard_password_mode:-keep}"
PWD_NEW="${wizard_admin_password:-}"
RMODE="${wizard_restart_mode:-restart}"

DD="$(data_dir 2>/dev/null)"
[ -n "$DD" ] || DD="/vol1/@appshare/zyjkw-monitor/data"

# ---------- 1) 端口：只在真的变了才写 ----------
if [ -n "$HP" ]; then
    CUR_HP="$(cfg_port http_port 10001 2>/dev/null)"
    CUR_HS="$(cfg_port https_port 10002 2>/dev/null)"
    if [ "$HP" != "$CUR_HP" ] || { [ -n "$HS" ] && [ "$HS" != "$CUR_HS" ]; }; then
        PY="$(find_python 2>/dev/null)" || PY=""
        if [ -n "$PY" ]; then
            log "写入端口：HTTP=$HP HTTPS=${HS:-（不启用）}"
            "$PY" - "$DD" "$HP" "$HS" <<'PYEOF' >> "$TRACE" 2>&1 || true
import json, os, sys
dd, hp, hs = sys.argv[1], sys.argv[2], sys.argv[3]
p = os.path.join(dd, "server_config.json")
d = {}
try:
    with open(p, encoding="utf-8") as f:
        d = json.load(f) or {}
except Exception:
    d = {}
if hp:
    d["http_port"] = int(hp)
d["https_port"] = int(hs) if hs else 0
os.makedirs(dd, exist_ok=True)
tmp = p + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
    json.dump(d, f, ensure_ascii=False, indent=2)
os.replace(tmp, p)
print("server_config:", d)
PYEOF
            # 同步到飞牛认的几处：manifest.service_port + target/ui/config.port + wizard
            # （三处必须是同一个端口，否则「打开」按钮和桌面临时会失效）
            HTTP_PORT="$HP"
            HTTPS_PORT="${HS:-$HTTPS_PORT}"
            sync_manifest_port
            NEED_RESTART=1
        else
            log "找不到 Python，跳过端口写入"
        fi
    fi
fi

# ---------- 2) 密码：只有真的填了新密码才改 ----------
NEED_RESTART="${NEED_RESTART:-0}"
if [ "$MODE" != "keep" ] && [ -n "$PWD_NEW" ]; then
    PY="$(find_python 2>/dev/null)" || PY=""
    if [ -n "$PY" ]; then
        log "按选择处理管理员密码"
        "$PY" - "$DD" "$MODE" "$PWD_NEW" <<'PYEOF' >> "$TRACE" 2>&1 || true
import hashlib, json, os, secrets, sys
dd, mode, pwd = sys.argv[1], sys.argv[2], sys.argv[3]
if mode == "random":
    alphabet = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"
    pwd = "RM" + "".join(secrets.choice(alphabet) for _ in range(10))
p = os.path.join(dd, "data_users.json")
try:
    with open(p, encoding="utf-8") as f:
        users = json.load(f) or {}
except Exception:
    users = {}
if not users:
    print("还没有账号，跳过")
    sys.exit(0)
target = "admin" if "admin" in users else next(iter(users))
salt = secrets.token_hex(8)
users[target]["pwd"] = salt + "$" + hashlib.sha256((salt + "::" + pwd).encode()).hexdigest()
users[target]["fail_count"] = 0
users[target]["locked"] = False
tmp = p + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
    json.dump(users, f, ensure_ascii=False, indent=2)
os.replace(tmp, p)
print("NEWPASSWORD=" + pwd if mode == "random" else "密码已更新")
PYEOF
        NEED_RESTART=1
    fi
fi

# ---------- 3) 需要重启才重启 ----------
if [ "$NEED_RESTART" = "1" ] && [ "$RMODE" = "restart" ]; then
    ROOT="$(app_root 2>/dev/null)"
    log "重启服务使配置生效…"
    "${ROOT}/cmd/main" stop  >/dev/null 2>&1 || true
    sleep 1
    "${ROOT}/cmd/main" start >/dev/null 2>&1 || true
    log "已重启"
else
    # 访问权限之类的改动：我们什么都不用做
    log "本次无需重启应用"
fi

echo "  → ok" >> "$TRACE" 2>/dev/null
exit 0
