#!/bin/bash
# 安装文件就位后执行（以 root 运行）：
# 1. 校验安装向导的管理端口与管理员初始密码，检查端口占用，写入 @appconf（0600）；
# 2. 把全部源码从安装目录复制到可写运行目录 @appdata/xfserver/server，并 chown 给 xfserver；
# 3. 同步桌面入口端口、创建数据目录。
# 此后应用的启动/停止只由 cmd/main 负责，不再在启动时同步文件。
set -e

APP_USER="${TRIM_USERNAME:-xfserver}"
SRC="$TRIM_APPDEST/server"
WORK_DIR="$TRIM_PKGVAR/server"
CONF_DIR="$TRIM_PKGETC"
CONF_FILE="$CONF_DIR/xfserver.env"
UI_CONFIG="$TRIM_APPDEST/ui/config"

DEFAULT_PORT=8080
FIXED_CLIENT_API_PORT=9400

PORT="${wizard_server_port:-$DEFAULT_PORT}"
ADMIN_PASSWORD="${wizard_admin_password:-}"

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

# 校验管理员初始密码 8-128 位（服务端 validatePassword 同规则）。
if [ -z "$ADMIN_PASSWORD" ]; then
  echo "请填写管理员初始密码" > "$TRIM_TEMP_LOGFILE"
  exit 1
fi
PASS_LEN=${#ADMIN_PASSWORD}
if [ "$PASS_LEN" -lt 8 ] || [ "$PASS_LEN" -gt 128 ]; then
  echo "管理员初始密码长度须为 8-128 位" > "$TRIM_TEMP_LOGFILE"
  exit 1
fi

# 端口占用检查：管理控制台端口 + 固定通信端口 9400 必须空闲，否则终止安装。
# 通过监听地址的端口后缀匹配（0.0.0.0:8080 / [::]:9400 / *:8080），不会误命中 18080 等。
port_in_use() {
    local port="$1"
    if command -v ss >/dev/null 2>&1; then
        ss -ltn 2>/dev/null | awk '{print $4}' | grep -E "[:.]${port}\$" >/dev/null 2>&1
    elif command -v netstat >/dev/null 2>&1; then
        netstat -ltn 2>/dev/null | awk '{print $4}' | grep -E "[:.]${port}\$" >/dev/null 2>&1
    else
        return 1
    fi
}
if port_in_use "$PORT"; then
  echo "管理控制台端口 ${PORT} 已被占用，请更换端口或先释放该端口后重新安装（可执行 ss -ltnp | grep :${PORT} 查看占用进程）" > "$TRIM_TEMP_LOGFILE"
  exit 1
fi
if port_in_use "$FIXED_CLIENT_API_PORT"; then
  echo "客户端通信端口 ${FIXED_CLIENT_API_PORT} 已被占用（该端口固定不可更改），请先释放该端口后重新安装（可执行 ss -ltnp | grep :${FIXED_CLIENT_API_PORT} 查看占用进程）" > "$TRIM_TEMP_LOGFILE"
  exit 1
fi

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

# 2. 源码就位到可写运行目录（应用从此目录启动，在线更新也写入此处）。
mkdir -p "$WORK_DIR"
cp -a "$SRC/." "$WORK_DIR/"
[ -f "$WORK_DIR/bin/frps" ] && chmod 700 "$WORK_DIR/bin/frps" 2>/dev/null || true

# 3. 数据目录，并把整个 @appdata 运行区归属应用用户（root 复制出的文件默认属 root，必须 chown）。
mkdir -p "${TRIM_PKGVAR}/data/server" "${TRIM_PKGVAR}/runtime/server"
chown -R "$APP_USER:$APP_USER" "$TRIM_PKGVAR" 2>/dev/null || true

# 4. 端口与默认值不同时，同步桌面 iframe 入口端口。
if [ -f "$UI_CONFIG" ] && [ "$PORT" != "$DEFAULT_PORT" ]; then
    sed -i "s/\"port\": *\"[0-9]*\"/\"port\": \"$PORT\"/" "$UI_CONFIG"
fi

exit 0
