#!/bin/bash

LAUNCHER_NAME=$(basename "$0")
UPDATE_MODULE_ROOT="/opt/update-module/current"
LOG_FILE="/var/log/update-launcher.log"

COMPONENT_NAME="$1"
if [ -z "$COMPONENT_NAME" ]; then
    echo "Usage: $0 <component_name> [args...]"
    exit 1
fi

UPDATED_LAUNCHER="$UPDATE_MODULE_ROOT/usr/bin/$LAUNCHER_NAME"

# 入口脚本自升级判断
if [ -x "$UPDATED_LAUNCHER" ] && [ "$(readlink -f "$0")" != "$(readlink -f "$UPDATED_LAUNCHER")" ]; then
    exec "$UPDATED_LAUNCHER" "$@"
fi

# ------------ 添加所有内容在此行之后 ------------

shift 1  # 移除组件名，剩余为目标程序参数

# 动态获取多架构目录
LIB_ARCH=$(dpkg-architecture -qDEB_TARGET_MULTIARCH 2>/dev/null)
if [ -z "$LIB_ARCH" ]; then
    echo "Error: Cannot determine multiarch directory"
    exit 1
fi

# 获取系统路径
SYSTEM_BIN_PATH=$(command -v "$COMPONENT_NAME")
if [ -z "$SYSTEM_BIN_PATH" ]; then
    echo "Error: Cannot find system program for $COMPONENT_NAME"
    exit 1
fi

# 白名单列表：在这些路径的程序不设置 LD_LIBRARY_PATH
EXCLUDE_LD_PATH=(
    "/usr/bin/backup-daemon"
    "/usr/bin/kylin-software-properties-service"
    "/usr/share/kylin-system-updater/kylin-upgrade-strategies"
)

# 判断目标程序是否在白名单中
is_excluded() {
    local target="$1"
    for p in "${EXCLUDE_LD_PATH[@]}"; do
        if [ "$target" = "$p" ]; then
            return 0  # 在白名单中
        fi
    done
    return 1  # 不在白名单中
}

export GI_TYPELIB_PATH="$UPDATE_MODULE_ROOT/usr/lib/$LIB_ARCH/girepository-1.0:${GI_TYPELIB_PATH:-}"
export PYTHONPATH="$UPDATE_MODULE_ROOT/usr/lib/python3/dist-packages:${PYTHONPATH:-}"

# 设置运行时环境变量（仅当不在白名单中）
if ! is_excluded "$SYSTEM_BIN_PATH"; then    
    export LD_LIBRARY_PATH="$UPDATE_MODULE_ROOT/usr/lib/$LIB_ARCH:${LD_LIBRARY_PATH:-}"
fi

# 拼接更新程序路径
UPDATED_BIN_PATH="${UPDATE_MODULE_ROOT}${SYSTEM_BIN_PATH}"

# 执行优先更新版本或原始版本
if [ -x "$UPDATED_BIN_PATH" ]; then
    export RUN_ROOT_DIR="$UPDATE_MODULE_ROOT"
    exec "$UPDATED_BIN_PATH" "$@"
else
    export RUN_ROOT_DIR="/"
    exec "$SYSTEM_BIN_PATH" "$@"
fi
