#!/bin/bash
# ============================================================================
# postinst - Debian 包安装后脚本
# ============================================================================
# 功能: 在 deb 包安装完成后执行系统级配置和用户环境初始化
# 调用时机: dpkg 安装包后自动执行
# ============================================================================

set -e  # 遇到错误立即退出

# ============================================================================
# 第一部分: Electron 标准安装逻辑 (由 electron-builder 生成)
# ============================================================================

# ----------------------------------------------------------------------------
# 1. 创建系统命令链接 (使应用可通过命令行直接调用)
# ----------------------------------------------------------------------------
# 使用 update-alternatives 管理多版本共存的符号链接
# 优先级 100 表示默认选择此版本
if type update-alternatives >/dev/null 2>&1; then
    # 如果 /usr/bin/testpkg 是普通符号链接(非 alternatives 管理的),先删除
    if [ -L '/usr/bin/testpkg' ] && [ -e '/usr/bin/testpkg' ] && [ "$(readlink '/usr/bin/testpkg')" != '/etc/alternatives/testpkg' ]; then
        rm -f '/usr/bin/testpkg'
    fi
    # 注册到 alternatives 系统,失败则降级为直接创建符号链接
    update-alternatives --install '/usr/bin/testpkg' 'testpkg' '/opt/Testpkg/testpkg' 100 || ln -sf '/opt/Testpkg/testpkg' '/usr/bin/testpkg'
else
    # 系统不支持 update-alternatives,直接创建符号链接
    ln -sf '/opt/Testpkg/testpkg' '/usr/bin/testpkg'
fi

# ----------------------------------------------------------------------------
# 2. 配置 Chrome 沙箱权限 (Electron 安全机制)
# ----------------------------------------------------------------------------
# 检查系统是否支持用户命名空间 (User Namespaces)
# 不支持则需要 setuid 权限 (4755),支持则普通权限即可 (0755)
if ! { [ -L /proc/self/ns/user ] && unshare --user true; }; then
    # 旧内核或禁用了 user namespaces,需要 setuid root 权限
    chmod 4755 '/opt/Testpkg/chrome-sandbox' || true
else
    # 现代内核支持 user namespaces,不需要 setuid
    chmod 0755 '/opt/Testpkg/chrome-sandbox' || true
fi

# ----------------------------------------------------------------------------
# 3. 更新系统 MIME 类型数据库 (文件关联)
# ----------------------------------------------------------------------------
# 使系统识别应用支持的文件类型,用于 "打开方式" 菜单
if hash update-mime-database 2>/dev/null; then
    update-mime-database /usr/share/mime || true
fi

# ----------------------------------------------------------------------------
# 4. 更新桌面应用数据库 (应用菜单图标)
# ----------------------------------------------------------------------------
# 刷新桌面环境的应用列表缓存,使应用图标出现在启动器中
if hash update-desktop-database 2>/dev/null; then
    update-desktop-database /usr/share/applications || true
fi

# ----------------------------------------------------------------------------
# 5. 安装 AppArmor 安全配置 (Linux 强制访问控制)
# ----------------------------------------------------------------------------
# AppArmor 限制应用可访问的系统资源,提升安全性
if apparmor_status --enabled > /dev/null 2>&1; then
  APPARMOR_PROFILE_SOURCE='/opt/Testpkg/resources/apparmor-profile'
  APPARMOR_PROFILE_TARGET='/etc/apparmor.d/testpkg'

  # 验证配置文件语法是否被当前 AppArmor 版本支持
  if apparmor_parser --skip-kernel-load --debug "$APPARMOR_PROFILE_SOURCE" > /dev/null 2>&1; then
    # 复制到系统 AppArmor 配置目录
    cp -f "$APPARMOR_PROFILE_SOURCE" "$APPARMOR_PROFILE_TARGET"

    # 如果不在 chroot 环境中,立即加载配置到内核
    if ! { [ -x '/usr/bin/ischroot' ] && /usr/bin/ischroot; } && hash apparmor_parser 2>/dev/null; then
      apparmor_parser --replace --write-cache --skip-read-cache "$APPARMOR_PROFILE_TARGET"
    fi
  else
    echo "跳过 AppArmor 配置文件安装，因为当前 AppArmor 版本似乎不支持捆绑的配置文件"
  fi
fi

# ============================================================================
# 第二部分: 自定义应用初始化逻辑
# ============================================================================

# ----------------------------------------------------------------------------
# 6. 设置捆绑脚本的执行权限
# ----------------------------------------------------------------------------
# 为应用自带的 shell 和 python 脚本添加可执行权限
if [ -d "/opt/Testpkg/scripts" ]; then
    chmod +x /opt/Testpkg/scripts/*.sh 2>/dev/null || true
    chmod +x /opt/Testpkg/scripts/*.py 2>/dev/null || true
    echo "✓ 脚本执行权限已设置"
fi

# ----------------------------------------------------------------------------
# 7. 配置捆绑配置文件的权限
# ----------------------------------------------------------------------------
# 确保系统级配置模板所有用户可读 (但不可写,防止普通用户篡改)
BUNDLED_CONFIG="/opt/Testpkg/resources/configs"
if [ -d "$BUNDLED_CONFIG" ]; then
    # 目录权限: rwxr-xr-x (755) - 所有者可写,其他人只读和执行
    find "$BUNDLED_CONFIG" -type d -exec chmod 755 {} \;
    # 文件权限: rw-r--r-- (644) - 所有者可写,其他人只读
    find "$BUNDLED_CONFIG" -type f -exec chmod 644 {} \;
fi

# ----------------------------------------------------------------------------
# 8. 检测实际执行安装的用户 (sudo/pkexec 背后的真实用户)
# ----------------------------------------------------------------------------
# 场景: 用户执行 "sudo apt install testpkg.deb" 时
# - $USER 变成 root (误导)
# - $SUDO_USER 才是真实用户
# - $SUDO_UID 是真实用户的 UID
if [ -n "$SUDO_USER" ]; then
    # 通过 sudo 安装 (最常见)
    REAL_USER="$SUDO_USER"
    REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6)
elif [ -n "$PKEXEC_UID" ]; then
    # 通过 pkexec 安装 (图形界面授权)
    REAL_USER=$(getent passwd "$PKEXEC_UID" | cut -d: -f1)
    REAL_HOME=$(getent passwd "$PKEXEC_UID" | cut -d: -f6)
else
    # 无法确定真实用户 (可能是系统级无人值守安装)
    REAL_USER=""
    REAL_HOME=""
fi

# ----------------------------------------------------------------------------
# 9. 为实际用户初始化配置和数据目录
# ----------------------------------------------------------------------------
# 只有确定了真实用户才执行初始化,避免为 root 创建配置
if [ -n "$REAL_USER" ] && [ -d "$REAL_HOME" ]; then
    # XDG Base Directory 规范路径
    USER_CONFIG_DIR="$REAL_HOME/.config/testpkg"        # 配置文件
    USER_DATA_DIR="$REAL_HOME/.local/share/testpkg"     # 应用数据
    USER_ELECTRON_DIR="$REAL_HOME/.config/testpkg-electron"  # Electron 数据（会话、首选项等）

    # 创建目录结构 (使用 sudo -u 确保目录属于真实用户而非 root)
    sudo -u "$REAL_USER" mkdir -p "$USER_CONFIG_DIR"
    sudo -u "$REAL_USER" mkdir -p "$USER_DATA_DIR/logs"      # 日志子目录
    sudo -u "$REAL_USER" mkdir -p "$USER_DATA_DIR/reports"   # 报告子目录
    sudo -u "$REAL_USER" mkdir -p "$USER_ELECTRON_DIR"       # Electron 数据目录

    # ----------------------------------------------------------------------------
    # 10. 复制配置模板到用户目录（递归，去掉 .example 后缀，已存在不覆盖）
    # ----------------------------------------------------------------------------
    if [ -d "$BUNDLED_CONFIG" ]; then
        # 用 find 遍历所有捆绑配置文件
        find "$BUNDLED_CONFIG" -type f | while IFS= read -r src; do
            rel="${src#$BUNDLED_CONFIG/}"
            # 去掉 .example 后缀
            dst_name="${rel%.example}"
            dst="$USER_CONFIG_DIR/$dst_name"
            # 已存在则跳过（保留用户改动）
            if [ ! -f "$dst" ]; then
                sudo -u "$REAL_USER" mkdir -p "$(dirname "$dst")"
                sudo -u "$REAL_USER" cp "$src" "$dst"
            fi
        done
    fi

    # 向用户显示数据目录位置
    echo "=========================================="
    echo "数据目录已初始化:"
    echo "  配置: $USER_CONFIG_DIR/"
    echo "  日志: $USER_DATA_DIR/logs/"
    echo "  报告: $USER_DATA_DIR/reports/"
    echo "  Electron: $USER_ELECTRON_DIR/"
    echo "=========================================="
fi

exit 0
