#!/bin/bash
# 用户在应用设置页提交配置后执行：
# 1. 读取新端口/锁密码（留空表示保持原值）；
# 2. 更新持久配置与桌面入口端口；
# 3. 以 package 用户身份重启应用使配置生效。
set -e

APP_USER="${TRIM_USERNAME:-xfclient}"
CONF_DIR="$TRIM_PKGETC"
CONF_FILE="$CONF_DIR/xfclient.env"
UI_CONFIG="${TRIM_APPDEST}/ui/config"

DEFAULT_PORT=7400
DEFAULT_PASSWORD='xfcloud@123'

# 读取当前持久配置。
CUR_PORT="$DEFAULT_PORT"
CUR_PASSWORD="$DEFAULT_PASSWORD"
if [ -f "$CONF_FILE" ]; then
  while IFS='=' read -r key value; do
    case "$key" in
      CLIENT_PORT)
        [ -n "$value" ] && CUR_PORT="$value"
        ;;
      CLIENT_FRPC_PASSWORD)
        [ -n "$value" ] && CUR_PASSWORD="$value"
        ;;
    esac
  done < "$CONF_FILE"
fi

# 向导字段留空则保持原值。
PORT="${wizard_client_port:-}"
PASSWORD="${wizard_frpc_password:-}"
[ -z "$PORT" ] && PORT="$CUR_PORT"
[ -z "$PASSWORD" ] && PASSWORD="$CUR_PASSWORD"

# 校验端口 1-65535。
case "$PORT" in
  ''|*[!0-9]*)
    echo "Web 控制台端口无效：$PORT" > "$TRIM_TEMP_LOGFILE"
    exit 1
    ;;
esac
if [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
  echo "Web 控制台端口须在 1-65535 之间：$PORT" > "$TRIM_TEMP_LOGFILE"
  exit 1
fi

# 校验锁密码长度。
if [ "${#PASSWORD}" -lt 6 ] || [ "${#PASSWORD}" -gt 128 ]; then
  echo "frpc 锁密码长度须为 6-128 位" > "$TRIM_TEMP_LOGFILE"
  exit 1
fi

# 重写持久配置（printf 逐行写入，值只作为数据、不做二次解析）。
mkdir -p "$CONF_DIR"
umask 077
printf '%s=%s\n' CLIENT_PORT "$PORT" > "$CONF_FILE"
printf '%s=%s\n' CLIENT_FRPC_PASSWORD "$PASSWORD" >> "$CONF_FILE"
chmod 600 "$CONF_FILE"
chown "$APP_USER:$APP_USER" "$CONF_FILE" 2>/dev/null || true

# 始终把桌面入口同步为实际端口。
if [ -f "$UI_CONFIG" ]; then
  sed -i "s/\"port\": *\"[0-9]*\"/\"port\": \"$PORT\"/" "$UI_CONFIG"
fi

# 以应用专用用户重启服务（cmd/main 设计为幂等，可安全重复调用）。
CMD_MAIN="$(dirname "$TRIM_APPDEST")/cmd/main"
if command -v su >/dev/null 2>&1; then
  env TRIM_APPDEST="$TRIM_APPDEST" \
      TRIM_PKGVAR="$TRIM_PKGVAR" \
      TRIM_PKGETC="$TRIM_PKGETC" \
      TRIM_SERVICE_PORT="$TRIM_SERVICE_PORT" \
      TRIM_TEMP_LOGFILE="$TRIM_TEMP_LOGFILE" \
      TRIM_USERNAME="$APP_USER" \
      su -s /bin/bash "$APP_USER" -c "'$CMD_MAIN' stop; '$CMD_MAIN' start"
fi

exit 0
