#!/bin/bash

################################################################################
# FntermX 公共函数库
# 包含安装、卸载、升级过程中使用的公共函数
################################################################################

# ============================================================================
# 工具快捷方式
# ============================================================================
MV="/bin/mv -f"
RM="/bin/rm -rf"
CP="/bin/cp -rfp"
MKDIR="/bin/mkdir -p"
LN="/bin/ln -nsf"

# ============================================================================
# 路径定义
# ============================================================================
INST_ETC="/var/apps/${TRIM_APPNAME}/etc"
INST_VARIABLES="${INST_ETC}/installer-variables"
INST_LOG="/var/log/apps/${TRIM_APPNAME}.log"

LOG_FILE="${TRIM_PKGVAR}/${TRIM_APPNAME}.log"
PID_FILE="${TRIM_PKGVAR}/${TRIM_APPNAME}.pid"

# ============================================================================
# 日志函数
# ============================================================================
install_log ()
{
    local _msg_="$@"
    if [ -z "${_msg_}" ]; then
        # 从标准输入读取多行
        while IFS=$'\n' read -r line; do
            install_log "${line}"
        done
    else
        # stderr 输出到 /var/log/packages/{package}.log
        # stdout 输出到包管理器界面对话框
        echo -e "$(date +'%Y/%m/%d %H:%M:%S')\t${_msg_}" 1>&2
    fi
}

log_step ()
{
    install_log "===> Step $1. STATUS=${TRIM_APP_STATUS} PKGVAR=${TRIM_PKGVAR}"
}

# ============================================================================
# 服务管理函数
# ============================================================================

# 停止所有 tmux 会话
stop_tmux_sessions ()
{
    install_log "停止所有 FntermX tmux 会话..."
    local count=0
    
    tmux list-sessions 2>/dev/null | grep "fntermx_" | cut -d: -f1 | while read session; do
        if [ -n "$session" ]; then
            install_log "  停止会话: $session"
            tmux kill-session -t "$session" 2>/dev/null || true
            count=$((count + 1))
        fi
    done
    
    if [ $count -eq 0 ]; then
        install_log "  没有运行中的会话"
    else
        install_log "  已停止 $count 个会话"
    fi
}

# ============================================================================
# 清理函数
# ============================================================================

# 删除临时文件
clean_temp_files ()
{
    install_log "清理临时文件..."
    
    rm -f "${TRIM_PKGVAR}/fntermx_sessions.json"
    rm -f "${TRIM_PKGVAR}/fntermx_jwt_secret_v2"
    rm -f "${TRIM_PKGVAR}/fntermx.log"
    rm -f "${TRIM_PKGVAR}/fntermx.pid"
    rm -f "${TRIM_PKGVAR}/fntermx_auth.json"
    rm -rf "${TRIM_PKGVAR}/sessions"
    rm -rf "${TRIM_PKGVAR}/logs"
    rm -rf "${TRIM_PKGVAR}/outputs"
    
    install_log "临时文件清理完成"
}

# 删除所有用户数据
clean_all_data ()
{
    install_log "删除所有用户数据..."
    
    # 使用 find 命令删除所有内容但保留根目录
    if [ -d "${TRIM_PKGVAR}" ] && [ "$(ls -A ${TRIM_PKGVAR} 2>/dev/null)" != "" ]; then
        install_log "  清空数据目录: ${TRIM_PKGVAR}"
        find ${TRIM_PKGVAR} -mindepth 1 -delete -print 2>&1 | while read file; do
            install_log "    已删除: $file"
        done
    else
        install_log "  数据目录为空或不存在"
    fi
    
    # 清理系统元数据目录（如果有）
    if [ -d "/var/apps/${TRIM_APPNAME}/etc" ] && [ "$(ls -A /var/apps/${TRIM_APPNAME}/etc 2>/dev/null)" != "" ]; then
        install_log "  清空系统元数据目录: /var/apps/${TRIM_APPNAME}/etc"
        find /var/apps/${TRIM_APPNAME}/etc -mindepth 1 -delete -print 2>&1 | while read file; do
            install_log "    已删除: $file"
        done
    fi
    
    install_log "所有数据删除完成"
}

# 只清理升级过程中的临时数据
clean_upgrade_temp ()
{
    install_log "清理升级临时数据（保留用户配置）..."
    
    # 保留的文件：
    #   - fntermx_remote_configs.json (SSH配置)
    #   - fntermx_auth.json (认证密码)
    #   - fntermx_theme_settings.json (主题配置)
    #   - customcmd.json (自定义命令)
    #   - backgrounds/ (背景图片)
    #   - .ssh_encrypt_key (SSH密码加密密钥，必须保留！)
    
    # 删除临时数据和会话文件
    rm -f "${TRIM_PKGVAR}/fntermx_sessions.json"
    rm -f "${TRIM_PKGVAR}/fntermx_jwt_secret_v2"
    rm -f "${TRIM_PKGVAR}/fntermx.log"
    rm -f "${TRIM_PKGVAR}/fntermx.pid"
    # 注意：.ssh_encrypt_key 必须保留！用于解密SSH密码
    
    rm -rf "${TRIM_PKGVAR}/sessions"
    rm -rf "${TRIM_PKGVAR}/logs"
    rm -rf "${TRIM_PKGVAR}/outputs"
    
    install_log "升级临时数据清理完成（用户配置已保留）"
}

# ============================================================================
# 安装钩子函数
# ============================================================================

install_init ()
{
    log_step "install_init"
    exit 0
}

install_callback ()
{
    log_step "install_callback"
    
    # 创建必要的目录
    $MKDIR "${TRIM_PKGVAR}/sessions"
    $MKDIR "${TRIM_PKGVAR}/logs"
    $MKDIR "${TRIM_PKGVAR}/outputs"
    $MKDIR "${TRIM_PKGVAR}/backgrounds"
    
    install_log "安装完成，目录结构已初始化"
    exit 0
}

# ============================================================================
# 卸载钩子函数
# ============================================================================

uninstall_init ()
{
    log_step "uninstall_init"
    
    # 停止所有服务
    stop_tmux_sessions
    
    exit 0
}

uninstall_callback ()
{
    log_step "uninstall_callback"
    
    # ========================================================================
    # 检查是否是升级流程（通过标记文件判断）
    # ========================================================================
    # ⚠️ 临时兼容方案：使用旧版本的标记文件路径
    # 
    # 当前版本 (1.0.6): 使用 ${TRIM_PKGVAR}/fntermx/.upgrading
    # 原因: 旧版本 (1.0.3) 的 uninstall_callback 检查的是这个路径
    #       如果使用新路径，旧版本无法识别升级标记，会误删用户配置
    # 
    # 未来版本 (1.0.7+): 可改为 ${TRIM_PKGVAR}/.upgrading
    # 届时所有用户都已升级到 1.0.6+，不再需要兼容 1.0.3 的路径
    # ========================================================================
    UPGRADE_FLAG="${TRIM_PKGVAR}/fntermx/.upgrading"
    
    if [ -f "${UPGRADE_FLAG}" ]; then
        # ====================================================================
        # 升级流程：保留关键配置文件，删除临时数据
        # ====================================================================
        install_log "检测到升级标记，进入升级模式"
        
        # 停止所有 tmux 会话
        stop_tmux_sessions
        
        # 清理升级临时数据（保留用户配置）
        clean_upgrade_temp
        
        install_log "升级准备完成，用户配置已保留"
        exit 0
    fi
    
    # ========================================================================
    # 完全卸载流程：根据用户选择决定是否删除数据
    # ========================================================================
    install_log "进入完全卸载流程"
    
    # 停止所有 tmux 会话
    stop_tmux_sessions
    
    # 根据用户选择决定是否删除数据
    if [ "$wizard_delete_data" = "true" ]; then
        install_log "用户选择：删除所有数据"
        clean_all_data
        install_log "FntermX 已完全卸载，所有数据已删除"
    else
        install_log "用户选择：保留配置数据"
        clean_temp_files
        install_log "FntermX 已卸载，但配置数据已保留供将来使用"
        install_log "保留的文件："
        install_log "  - SSH 配置: ${TRIM_PKGVAR}/fntermx_remote_configs.json"
        install_log "  - 主题设置: ${TRIM_PKGVAR}/fntermx_theme_settings.json"
        install_log "  - 自定义命令: ${TRIM_PKGVAR}/customcmd.json"
        install_log "  - 背景图片: ${TRIM_PKGVAR}/backgrounds/"
    fi
    
    exit 0
}

# ============================================================================
# 升级钩子函数
# ============================================================================

upgrade_init ()
{
    log_step "upgrade_init"
    
    # ========================================================================
    # 创建升级标记文件
    # ========================================================================
    # ⚠️ 临时兼容方案：使用旧版本的标记文件路径
    # 
    # 当前版本 (1.0.6): 使用 ${TRIM_PKGVAR}/fntermx/.upgrading
    # 原因: 升级过程中系统会调用旧版本 (1.0.3) 的 uninstall_callback
    #       旧版本检查的是 ${TRIM_PKGVAR}/fntermx/.upgrading 这个路径
    #       如果我们创建在新路径，旧版本无法识别，会误删用户配置
    # 
    # 升级流程:
    #   1. 新版本 upgrade_init 创建标记 (本函数)
    #   2. 系统调用旧版本 uninstall_callback ← 旧版本检查旧路径
    #   3. 系统安装新版本
    #   4. 新版本 upgrade_callback 删除标记
    # 
    # 未来版本 (1.0.7+): 可改为 ${TRIM_PKGVAR}/.upgrading
    # 届时升级流程为 1.0.6→1.0.7，中间不再有旧版本参与
    # ========================================================================
    UPGRADE_FLAG="${TRIM_PKGVAR}/fntermx/.upgrading"
    $MKDIR "${TRIM_PKGVAR}/fntermx"
    touch "${UPGRADE_FLAG}"
    install_log "已创建升级标记: ${UPGRADE_FLAG}"
    
    # 停止所有服务
    stop_tmux_sessions
    
    install_log "升级前准备完成"
    exit 0
}

upgrade_callback ()
{
    log_step "upgrade_callback"
    
    # ========================================================================
    # 删除升级标记文件
    # ========================================================================
    # ⚠️ 临时兼容方案：使用旧版本的标记文件路径
    # 
    # 当前版本 (1.0.6): 使用 ${TRIM_PKGVAR}/fntermx/.upgrading
    # 原因: upgrade_init 创建的是这个路径，这里需要匹配删除
    # 
    # 未来版本 (1.0.7+): 可改为 ${TRIM_PKGVAR}/.upgrading
    # ========================================================================
    UPGRADE_FLAG="${TRIM_PKGVAR}/fntermx/.upgrading"
    rm -f "${UPGRADE_FLAG}"
    install_log "已删除升级标记"
    
    # 删除临时数据文件
    rm -f "${TRIM_PKGVAR}/fntermx_sessions.json"
    rm -f "${TRIM_PKGVAR}/fntermx_jwt_secret_v2"
    
    # 删除临时目录
    rm -rf "${TRIM_PKGVAR}/sessions"
    rm -rf "${TRIM_PKGVAR}/logs"
    rm -rf "${TRIM_PKGVAR}/outputs"
    rm -rf "${TRIM_PKGVAR}/fntermx"
    
    # 重新创建必要的目录
    $MKDIR "${TRIM_PKGVAR}/sessions"
    $MKDIR "${TRIM_PKGVAR}/logs"
    $MKDIR "${TRIM_PKGVAR}/outputs"
    
    # 确保 backgrounds 目录存在（如果不存在则创建，如果存在则保留）
    $MKDIR "${TRIM_PKGVAR}/backgrounds"
    
    # ========================================================================
    # 密码加密迁移标记（从 1.0.3 明文密码迁移到 1.0.6 加密密码）
    # ========================================================================
    # 注意：实际的密码迁移将在应用首次启动时自动执行
    # 这里只创建迁移标记，让应用知道需要进行密码迁移
    
    REMOTE_CONFIG_FILE="${TRIM_PKGVAR}/fntermx_remote_configs.json"
    ENCRYPT_KEY_FILE="${TRIM_PKGVAR}/.ssh_encrypt_key"
    MIGRATION_FLAG="${TRIM_PKGVAR}/.need_password_migration"
    
    # 检查是否需要迁移：配置文件存在，但加密密钥不存在
    if [ -f "${REMOTE_CONFIG_FILE}" ] && [ ! -f "${ENCRYPT_KEY_FILE}" ]; then
        install_log "检测到旧版本 SSH 配置，创建密码迁移标记..."
        touch "${MIGRATION_FLAG}"
        install_log "密码迁移将在应用首次启动时自动执行"
    fi
    
    install_log "升级完成，目录结构已重建"
    exit 0
}

