#!/usr/bin/env bash
# HeLink 禾光 — Linux 自动安装器
#
# 用法：
#   sudo bash helink-install.sh                # 自动检测系统并安装
#   sudo bash helink-install.sh --uninstall    # 卸载
#   sudo bash helink-install.sh --version 0.46.11   # 指定版本
#
# 安装流程：
#   1. 探测目标系统 glibc 版本，自动挑 modern (≥2.39) 还是 kylin (≥2.31) bundle
#   2. 检查 /opt/helink 是否已装且版本一致；一致则跳过下载
#   3. wget bundle 到 /tmp，解压到 /opt/helink
#   4. 安装 .desktop 文件到系统菜单 + 当前用户桌面
#   5. 创建 /usr/local/bin/helink 启动器
#   6. 配置 /dev/uinput 权限（udev rule + input 组）
#
# 卸载：删 /opt/helink、/usr/share/applications/helink.desktop、
#       /usr/local/bin/helink、~/Desktop/helink.desktop、udev rule。

set -e

VERSION="${HELINK_VERSION:-0.46.11}"
BASE_URL="${HELINK_BASE_URL:-https://helink.96ck.com/dl}"
INSTALL_DIR="/opt/helink"
BIN_LINK="/usr/local/bin/helink"
DESKTOP_SYSTEM="/usr/share/applications/helink.desktop"
UDEV_RULE="/etc/udev/rules.d/99-helink-uinput.rules"

cyan()    { printf '\033[36m%s\033[0m\n' "$*"; }
yellow()  { printf '\033[33m%s\033[0m\n' "$*"; }
red()     { printf '\033[31m%s\033[0m\n' "$*" >&2; }
green()   { printf '\033[32m%s\033[0m\n' "$*"; }

# ── arg parsing ─────────────────────────────────────────────────────────
ACTION="install"
while [ $# -gt 0 ]; do
    case "$1" in
        --uninstall) ACTION="uninstall" ;;
        --version)   VERSION="$2"; shift ;;
        --version=*) VERSION="${1#*=}" ;;
        --base-url)  BASE_URL="$2"; shift ;;
        --base-url=*) BASE_URL="${1#*=}" ;;
        -h|--help)
            grep '^#' "$0" | sed 's/^# \{0,1\}//'
            exit 0 ;;
        *) red "未知参数: $1"; exit 2 ;;
    esac
    shift
done

# ── root check ──────────────────────────────────────────────────────────
if [ "$EUID" -ne 0 ]; then
    red "需要 root 权限。请改用: sudo bash $0 $@"
    exit 1
fi

REAL_USER="${SUDO_USER:-$USER}"
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
[ -z "$REAL_HOME" ] && REAL_HOME="/root"

# ── uninstall path ──────────────────────────────────────────────────────
if [ "$ACTION" = "uninstall" ]; then
    cyan "卸载 HeLink …"
    rm -rf "$INSTALL_DIR"
    rm -f  "$BIN_LINK"
    rm -f  "$DESKTOP_SYSTEM"
    rm -f  "$REAL_HOME/Desktop/helink.desktop"
    rm -f  "$REAL_HOME/桌面/helink.desktop"       # 中文桌面目录（KYLIN）
    rm -f  "$UDEV_RULE"
    udevadm control --reload-rules 2>/dev/null || true
    green "✓ 已删除 HeLink"
    yellow "提示：input 组成员仍然保留（如要移除：sudo gpasswd -d $REAL_USER input）"
    exit 0
fi

# ── detect glibc + pick bundle ──────────────────────────────────────────
GLIBC_VER=$(ldd --version 2>/dev/null | head -n1 | awk '{print $NF}')
if [ -z "$GLIBC_VER" ]; then
    red "无法识别系统 glibc 版本（ldd --version 失败）"
    exit 1
fi

ver_ge() {
    # ver_ge "2.39" "2.31" → true (2.39 ≥ 2.31)
    [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ]
}

if ver_ge "$GLIBC_VER" "2.39"; then
    FLAVOR="linux"
    cyan "系统 glibc $GLIBC_VER ≥ 2.39 → 使用 modern bundle"
elif ver_ge "$GLIBC_VER" "2.31"; then
    FLAVOR="kylin"
    cyan "系统 glibc $GLIBC_VER (在 [2.31, 2.39) 范围) → 使用 kylin bundle"
else
    red "系统 glibc $GLIBC_VER 太老 (< 2.31)，HeLink 当前不支持。"
    red "请联系作者编译更老兼容版本，或升级系统。"
    exit 1
fi

TARBALL="helink-portable-${FLAVOR}-v${VERSION}.tar.gz"
URL="${BASE_URL}/${TARBALL}"
DOWNLOAD="/tmp/$TARBALL"

# ── check existing install — skip download if version matches ──────────
NEED_DOWNLOAD=1
if [ -f "$INSTALL_DIR/README.txt" ] &&
   grep -q "v${VERSION}" "$INSTALL_DIR/README.txt" 2>/dev/null; then
    cyan "已安装 HeLink v${VERSION}，跳过下载"
    NEED_DOWNLOAD=0
fi

if [ "$NEED_DOWNLOAD" = "1" ]; then
    if [ -f "$DOWNLOAD" ]; then
        cyan "已缓存 $DOWNLOAD，跳过下载（删除文件后可重新下载）"
    else
        cyan "下载 $URL …"
        if command -v wget >/dev/null 2>&1; then
            wget --show-progress -O "$DOWNLOAD" "$URL"
        elif command -v curl >/dev/null 2>&1; then
            curl -fL --progress-bar -o "$DOWNLOAD" "$URL"
        else
            red "未找到 wget 或 curl，无法下载。请手动下载 $URL"
            exit 1
        fi
    fi

    cyan "解压到 $INSTALL_DIR …"
    rm -rf "$INSTALL_DIR"
    mkdir -p "$INSTALL_DIR"
    tar xzf "$DOWNLOAD" -C /tmp
    SRC_DIR=$(tar tzf "$DOWNLOAD" | head -n1 | cut -d/ -f1)
    cp -a "/tmp/$SRC_DIR/." "$INSTALL_DIR/"
    rm -rf "/tmp/$SRC_DIR"
fi

# ── desktop entry (system + user) ───────────────────────────────────────
cyan "安装 .desktop 文件 …"
mkdir -p "$(dirname "$DESKTOP_SYSTEM")"
cat > "$DESKTOP_SYSTEM" <<EOF
[Desktop Entry]
Type=Application
Version=1.0
Name=HeLink 禾光
Name[zh_CN]=禾光 远程桌面
GenericName=Remote Desktop
GenericName[zh_CN]=远程桌面
Comment=HeLink remote desktop client
Comment[zh_CN]=HeLink 禾光远程桌面客户端
Exec=$INSTALL_DIR/run.sh
Icon=$INSTALL_DIR/helink-256.png
Terminal=false
Categories=Network;RemoteAccess;
StartupNotify=true
EOF
chmod 644 "$DESKTOP_SYSTEM"
update-desktop-database /usr/share/applications 2>/dev/null || true

# Copy to user's desktop (both English "Desktop" and Chinese "桌面" paths).
for DESK_NAME in Desktop 桌面; do
    DESK_DIR="$REAL_HOME/$DESK_NAME"
    if [ -d "$DESK_DIR" ]; then
        DST="$DESK_DIR/helink.desktop"
        cp "$DESKTOP_SYSTEM" "$DST"
        chown "$REAL_USER:$REAL_USER" "$DST"
        # GNOME/KYLIN: mark trusted so the icon is double-clickable without
        # the "Untrusted Application Launcher" warning.
        chmod +x "$DST"
        gio set "$DST" metadata::trusted true 2>/dev/null || true
        green "✓ 桌面快捷方式: $DST"
    fi
done

# ── bin symlink ─────────────────────────────────────────────────────────
ln -sfn "$INSTALL_DIR/run.sh" "$BIN_LINK"
green "✓ 命令: $BIN_LINK"

# ── uinput permissions ─────────────────────────────────────────────────
cyan "配置 /dev/uinput 权限 …"
cat > "$UDEV_RULE" <<'EOF'
# HeLink: 允许 input 组成员写 /dev/uinput（内核虚拟输入设备）
# KYLIN/UKUI 等现代桌面 X11 XTest 注入会被静默丢弃，HeLink 用 uinput 绕过。
KERNEL=="uinput", GROUP="input", MODE="0660"
EOF
getent group input >/dev/null || groupadd input
gpasswd -a "$REAL_USER" input >/dev/null
udevadm control --reload-rules
udevadm trigger --subsystem-match=misc --attr-match=name=uinput || true
[ -e /dev/uinput ] && chgrp input /dev/uinput && chmod 0660 /dev/uinput

green "✓ udev 规则: $UDEV_RULE"
green "✓ 用户 $REAL_USER 已加入 input 组"

# ── done ────────────────────────────────────────────────────────────────
echo
green "════════════════════════════════════════════════════"
green "  HeLink v${VERSION} 已安装完成"
green "════════════════════════════════════════════════════"
echo
echo "  运行：双击桌面 [禾光 远程桌面] 图标，或终端跑 $BIN_LINK"
echo
yellow "  ⚠ 必须先 *注销并重新登录* 让 input 组生效，"
yellow "    否则鼠标键盘控制不响应。"
echo
echo "  验证：id | grep input"
echo "  卸载：sudo bash $0 --uninstall"
echo
