#!/bin/bash
#=============================================================================
#  逆向工程环境一键恢复脚本
#  功能: 从 tar.gz 压缩包恢复所有工具、脚本、密钥、配置
#  用法: bash /data/user/work/restore_android_re_env.sh /data/user/work/android_re_env.tar.gz
#  作者: AI逆向工程师
#  日期: 2026-07-15
#=============================================================================

set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

log_info()  { echo -e "${BLUE}[恢复]${NC} $*"; }
log_ok()    { echo -e "${GREEN}[完成]${NC} $*"; }
log_warn()  { echo -e "${YELLOW}[提示]${NC} $*"; }
log_err()   { echo -e "${RED}[错误]${NC} $*"; }
log_step()  { echo -e "${CYAN}[步骤]${NC} $*"; }

echo ""
echo "=============================================="
echo "  逆向工程环境一键恢复 v1.0"
echo "=============================================="
echo ""

# ========== 参数检查 ==========
ARCHIVE="$1"
if [ -z "$ARCHIVE" ]; then
    log_err "缺少参数！用法: bash $0 <tar.gz路径>"
    echo ""
    echo "示例:"
    echo "  bash /data/user/work/restore_android_re_env.sh /data/user/work/android_re_env.tar.gz"
    exit 1
fi

if [ ! -f "$ARCHIVE" ]; then
    log_err "文件不存在: $ARCHIVE"
    exit 1
fi

ARCHIVE_SIZE=$(stat -c%s "$ARCHIVE" 2>/dev/null || stat -f%z "$ARCHIVE" 2>/dev/null)
ARCHIVE_SIZE_MB=$((ARCHIVE_SIZE / 1024 / 1024))
log_info "压缩包: $ARCHIVE (${ARCHIVE_SIZE_MB}MB)"

# ========== 解压 ==========
EXTRACT_DIR="/tmp/re_env_restore_$(date +%s)"
log_step "1/8 解压压缩包..."
mkdir -p "$EXTRACT_DIR"
tar -xzf "$ARCHIVE" -C "$EXTRACT_DIR"
log_ok "解压完成: $EXTRACT_DIR"

BUNDLE_DIR="$EXTRACT_DIR/re_env_bundle"
if [ ! -d "$BUNDLE_DIR" ]; then
    # 尝试直接在根目录
    if [ -d "$EXTRACT_DIR/bin" ]; then
        BUNDLE_DIR="$EXTRACT_DIR"
    else
        log_err "压缩包结构异常，找不到 re_env_bundle/ 或 bin/ 目录"
        exit 1
    fi
fi

RESTORE_COUNT=0

# ========== 2. 二进制工具 ==========
log_step "2/8 恢复二进制工具..."

install_link() {
    local src="$1"
    local dst="$2"
    local name="$3"
    if [ -f "$src" ]; then
        mkdir -p "$(dirname "$dst")"
        # 如果是目录，递归复制
        if [ -d "$src" ]; then
            cp -r "$src"/* "$(dirname "$dst")/" 2>/dev/null || true
        else
            cp "$src" "$dst" 2>/dev/null || true
        fi
        if [ -f "$dst" ] || [ -d "$dst" ]; then
            chmod +x "$dst" 2>/dev/null || true
            log_ok "$name"
            ((RESTORE_COUNT++)) || true
        else
            log_warn "$name 复制失败"
        fi
    else
        log_warn "$name 源不存在"
    fi
}

# apktool
install_link "$BUNDLE_DIR/bin/apktool/apktool.jar" "/usr/local/bin/apktool.jar" "apktool.jar"
if [ -f "/usr/local/bin/apktool.jar" ] && [ ! -f "/usr/local/bin/apktool" ]; then
    echo '#!/bin/bash
java -jar /usr/local/bin/apktool.jar "$@"' > /usr/local/bin/apktool
    chmod +x /usr/local/bin/apktool
    log_ok "apktool 命令行包装"
fi

# jadx
if [ -d "$BUNDLE_DIR/bin/jadx/bin" ]; then
    cp -r "$BUNDLE_DIR/bin/jadx/bin"/* /usr/local/bin/ 2>/dev/null || true
    # 同时保留到/opt
    cp -r "$BUNDLE_DIR/bin/jadx" /opt/jadx 2>/dev/null || true
    chmod +x /usr/local/bin/jadx /usr/local/bin/jadx-gui 2>/dev/null || true
    log_ok "jadx 1.5.0"
    ((RESTORE_COUNT++)) || true
fi

# dex2jar
if [ -d "$BUNDLE_DIR/bin/dex2jar" ]; then
    cp -r "$BUNDLE_DIR/bin/dex2jar" /opt/dex2jar 2>/dev/null || true
    mkdir -p /opt/dex2jar
    cp -r "$BUNDLE_DIR/bin/dex2jar"/* /opt/dex2jar/ 2>/dev/null || true
    # 创建软链接
    DEX2JAR_SH=$(find /opt/dex2jar -name "d2j-dex2jar.sh" 2>/dev/null | head -1)
    if [ -n "$DEX2JAR_SH" ]; then
        ln -sf "$DEX2JAR_SH" /usr/local/bin/d2j-dex2jar 2>/dev/null || true
        chmod +x "$DEX2JAR_SH" 2>/dev/null || true
    fi
    BAKSMALI_SH=$(find /opt/dex2jar -name "d2j-baksmali.sh" 2>/dev/null | head -1)
    if [ -n "$BAKSMALI_SH" ]; then
        ln -sf "$BAKSMALI_SH" /usr/local/bin/baksmali 2>/dev/null || true
    fi
    log_ok "dex2jar"
    ((RESTORE_COUNT++)) || true
fi

# baksmali
if [ -f "$BUNDLE_DIR/bin/baksmali/baksmali.jar" ]; then
    cp "$BUNDLE_DIR/bin/baksmali/baksmali.jar" /usr/local/bin/baksmali.jar 2>/dev/null || true
    if [ ! -f "/usr/local/bin/baksmali" ]; then
        echo '#!/bin/bash
java -jar /usr/local/bin/baksmali.jar "$@"' > /usr/local/bin/baksmali
        chmod +x /usr/local/bin/baksmali
    fi
    log_ok "baksmali"
    ((RESTORE_COUNT++)) || true
fi

echo ""

# ========== 3. 脚本文件 ==========
log_step "3/8 恢复脚本文件..."

if [ -d "$BUNDLE_DIR/scripts" ]; then
    # 复制到 /workspace/ 根目录
    for f in "$BUNDLE_DIR/scripts"/*.sh "$BUNDLE_DIR/scripts"/*.py "$BUNDLE_DIR/scripts"/*.kt "$BUNDLE_DIR/scripts"/*.json; do
        [ -f "$f" ] || continue
        cp "$f" /workspace/ 2>/dev/null || true
        chmod +x "/workspace/$(basename "$f")" 2>/dev/null || true
    done
    log_ok "脚本文件 -> /workspace/"
    ((RESTORE_COUNT++)) || true

    # 恢复 init_re_env.sh 到kit目录
    if [ -f "$BUNDLE_DIR/scripts/init_re_env.sh" ]; then
        mkdir -p /workspace/reverse-engineering-kit
        cp "$BUNDLE_DIR/scripts/init_re_env.sh" /workspace/reverse-engineering-kit/init_re_env.sh
        chmod +x /workspace/reverse-engineering-kit/init_re_env.sh
        log_ok "init_re_env.sh -> /workspace/reverse-engineering-kit/"
    fi
fi
echo ""

# ========== 4. 笔记报告 ==========
log_step "4/8 恢复笔记报告..."

if [ -d "$BUNDLE_DIR/notes" ]; then
    cp "$BUNDLE_DIR/notes"/* /workspace/ 2>/dev/null || true
    log_ok "笔记报告 -> /workspace/"
    ((RESTORE_COUNT++)) || true
fi
echo ""

# ========== 5. 密钥文件 ==========
log_step "5/8 恢复密钥文件..."

if [ -d "$BUNDLE_DIR/keystore" ]; then
    mkdir -p /data/user/work
    cp "$BUNDLE_DIR/keystore"/* /data/user/work/ 2>/dev/null || true
    log_ok "密钥 -> /data/user/work/"
    ((RESTORE_COUNT++)) || true
fi
echo ""

# ========== 6. Python依赖 ==========
log_step "6/8 恢复Python依赖..."

if [ -f "$BUNDLE_DIR/config/pip_requirements.txt" ]; then
    log_info "检测需要安装的包..."
    PKGS_TO_INSTALL=""
    for pkg in frida-tools objection androguard quark-engine apkid reflutter; do
        if ! pip3 show "$pkg" &>/dev/null; then
            PKGS_TO_INSTALL="$PKGS_TO_INSTALL $pkg"
        fi
    done

    if [ -n "$PKGS_TO_INSTALL" ]; then
        log_info "安装缺失的Python包: $PKGS_TO_INSTALL"
        pip3 install --break-system-packages -q $PKGS_TO_INSTALL 2>&1 | tail -3
        log_ok "Python包安装完成"
    else
        log_ok "所有Python包已存在，跳过安装"
    fi
    ((RESTORE_COUNT++)) || true
else
    log_warn "pip_requirements.txt 不存在，跳过"
fi
echo ""

# ========== 7. Android构建工具 ==========
log_step "7/8 检查Android构建工具..."

APT_TOOLS=""
for cmd in zipalign apksigner aapt aapt2; do
    if ! command -v "$cmd" &>/dev/null; then
        APT_TOOLS="$APT_TOOLS $cmd"
    fi
done

if [ -n "$APT_TOOLS" ]; then
    log_info "安装缺失的构建工具: $APT_TOOLS"
    apt-get update -qq 2>/dev/null
    apt-get install -y -qq android-sdk-build-tools 2>&1 | tail -3
    log_ok "Android构建工具安装完成"
else
    log_ok "所有Android构建工具已存在"
fi
echo ""

# ========== 8. PATH配置 ==========
log_step "8/8 配置PATH环境..."

# 写入bashrc（幂等，不会重复）
if ! grep -q "逆向工程环境初始化" ~/.bashrc 2>/dev/null; then
    cat >> ~/.bashrc << 'BASHRC_EOF'

# ====== 逆向工程环境PATH（自动添加） ======
export PATH="$PATH:/opt/jadx/bin:/opt/dex2jar/dex-tools-v2.4:$HOME/.local/bin"
BASHRC_EOF
    log_ok "PATH已写入 ~/.bashrc"
else
    log_ok "PATH已在 ~/.bashrc中，跳过"
fi

# 设置当前shell的PATH
export PATH="$PATH:/opt/jadx/bin:/opt/dex2jar/dex-tools-v2.4:/usr/local/bin:$HOME/.local/bin:/workspace"
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java) 2>/dev/null || echo "/usr/bin/java")))

echo ""

# ========== 清理临时文件 ==========
rm -rf "$EXTRACT_DIR"

# ========== 最终验证 ==========
echo "=============================================="
log_ok "环境恢复完成！"
echo ""
echo "恢复统计: $RESTORE_COUNT 个组件"
echo ""

echo -e "${CYAN}=== 工具验证 ===${NC}"
check_tool() {
    if command -v "$1" &>/dev/null; then
        echo -e "  ${GREEN}✅${NC} $1"
    else
        echo -e "  ${RED}❌${NC} $1"
    fi
}

echo -e "${YELLOW}[Android构建工具]${NC}"
check_tool "java"
check_tool "apktool"
check_tool "zipalign"
check_tool "apksigner"
check_tool "aapt"

echo -e "${YELLOW}[反编译工具]${NC}"
check_tool "jadx"
check_tool "d2j-dex2jar"
check_tool "baksmali"

echo -e "${YELLOW}[动态分析]${NC}"
check_tool "frida"
check_tool "objection"

echo -e "${YELLOW}[Flutter逆向]${NC}"
check_tool "reflutter"
check_tool "apkid"

echo -e "${YELLOW}[静态分析]${NC}"
check_tool "androguard"
check_tool "quark"
check_tool "binwalk"

echo -e "${YELLOW}[脚本]${NC}"
if [ -f "/workspace/auto-reverse.sh" ]; then
    echo -e "  ${GREEN}✅${NC} auto-reverse.sh"
else
    echo -e "  ${RED}❌${NC} auto-reverse.sh"
fi
if [ -f "/workspace/reverse-engineering-kit/init_re_env.sh" ]; then
    echo -e "  ${GREEN}✅${NC} init_re_env.sh"
else
    echo -e "  ${RED}❌${NC} init_re_env.sh"
fi

echo ""
echo -e "${GREEN}=============================================="
echo "  新窗口初始化命令:"
echo "  source /workspace/reverse-engineering-kit/init_re_env.sh"
echo ""
echo "  快捷命令: quick_analysis / decompile / repack / upload_mpimg"
echo "==============================================${NC}"
echo ""
