#!/bin/bash

# =============================================
# 增强版APK加固脚本 (用户交互模式)
# 支持两种模式：默认签名模式 和 自定义签名模式
# 注意：此脚本需在jiagu目录内运行
# =============================================

# 颜色定义
COLOR_TITLE="\033[1;36m"      # 标题 - 青色加粗
COLOR_STEP="\033[1;35m"       # 步骤 - 紫色加粗
COLOR_SUCCESS="\033[1;32m"    # 成功 - 绿色加粗
COLOR_ERROR="\033[1;31m"      # 错误 - 红色加粗
COLOR_WARNING="\033[1;33m"    # 警告 - 黄色加粗
COLOR_INFO="\033[1;34m"       # 信息 - 蓝色加粗
COLOR_MENU="\033[1;36m"       # 菜单 - 青色加粗
COLOR_INPUT="\033[1;37m"      # 输入提示 - 白色加粗
COLOR_RESET="\033[0m"         # 重置颜色

# 显示使用帮助
show_help() {
    echo -e "\n${COLOR_TITLE}判官APK加固脚本使用说明${COLOR_RESET}"
    echo "此脚本提供两种加固模式："
    echo -e "${COLOR_SUCCESS}1. 默认签名模式：${COLOR_RESET}"
    echo "  自动扫描jiagu/APK目录下的APK文件"
    echo "  使用默认签名配置: 别名=apk, 密码=123456"
    echo "  加固后的APK将输出到out目录"
    echo ""
    echo -e "${COLOR_SUCCESS}2. 自定义签名模式：${COLOR_RESET}"
    echo "  手动指定签名文件加固"
    echo "  加固后的APK将输出到out目录"
    echo ""
    echo -e "${COLOR_WARNING}使用方式：${COLOR_RESET}"
    echo "  ./jg.sh"
    exit 1
}

# 显示彩色标题
show_header() {
    echo -e "\n${COLOR_TITLE}=================================="
    echo " 判官APK普通加固工具-独立版"
    echo "==================================${COLOR_RESET}"
}

# 显示菜单选项
show_menu() {
    echo -e "\n${COLOR_MENU}请选择加固模式：${COLOR_RESET}"
    echo "1) 默认签名模式 (自动默认签名加固)"
    echo "2) 自定义签名模式 (手动指定签名加固)"
    echo "3) 退出"
    echo -en "${COLOR_INPUT}请输入选项 [1-3]: ${COLOR_RESET}"
}

# 扫描APK目录并选择文件
select_apk() {
    APK_DIR="APK"
    
    # 确保APK目录存在
    if [ ! -d "$APK_DIR" ]; then
        mkdir -p "$APK_DIR"
        echo -e "${COLOR_WARNING}提示：已创建APK目录，请将待加固的APK文件放入 $APK_DIR/${COLOR_RESET}"
        return 1
    fi
    
    # 查找APK文件
    apk_files=("$APK_DIR"/*.apk)
    if [ ${#apk_files[@]} -eq 0 ]; then
        echo -e "${COLOR_ERROR}错误：$APK_DIR 目录下未找到APK文件！${COLOR_RESET}"
        echo -e "${COLOR_WARNING}请将待加固的APK文件放入 $APK_DIR/ 目录${COLOR_RESET}"
        return 1
    fi
    
    echo -e "\n${COLOR_INFO}检测到以下APK文件：${COLOR_RESET}"
    local i=1
    for apk in "${apk_files[@]}"; do
        echo "$i) $(basename "$apk")"
        ((i++))
    done
    
    echo -en "${COLOR_INPUT}请选择要加固的APK文件 [1-${#apk_files[@]}]: ${COLOR_RESET}"
    read choice
    
    # 验证选择
    if [[ ! $choice =~ ^[0-9]+$ ]] || ((choice < 1 || choice > ${#apk_files[@]})); then
        echo -e "${COLOR_ERROR}错误：无效的选择！${COLOR_RESET}"
        return 1
    fi
    
    # 设置选择的APK路径
    APK_PATH="${apk_files[$choice-1]}"
    IDENTIFIER=$(basename "$APK_PATH" .apk)
    echo -e "${COLOR_SUCCESS}已选择: $APK_PATH${COLOR_RESET}"
    return 0
}

# 默认签名模式处理
simple_mode() {
    echo -e "\n${COLOR_TITLE}===== 默认签名模式 =====${COLOR_RESET}"
    
    # 扫描并选择APK文件
    if ! select_apk; then
        return 1
    fi
    
    # 设置默认签名配置
    KEYSTORE_PATH="./apk.keystore"
    ALIAS="apk"
    KEYSTORE_PASS="123456"
    KEY_PASS="123456"
    
    # 检查默认密钥库是否存在
    if [ ! -f "$KEYSTORE_PATH" ]; then
        echo -e "${COLOR_WARNING}提示：未找到默认密钥库，将创建新的密钥库...${COLOR_RESET}"
        keytool -genkey -v -keystore "$KEYSTORE_PATH" -alias "$ALIAS" \
            -storetype PKCS12 \
            -keyalg RSA -keysize 2048 \
            -sigalg SHA256withRSA \
            -validity 10000 \
            -storepass "$KEYSTORE_PASS" -keypass "$KEY_PASS" \
            -dname "CN=判官网络, OU=判官标准版, O=判官出品, L=必属精品, ST=判官正版, C=CN"
    fi
    
    echo -e "${COLOR_SUCCESS}使用默认签名配置:${COLOR_RESET}"
    echo "密钥库: $(basename "$KEYSTORE_PATH")"
    echo "别名: $ALIAS"
    echo "密钥库密码: $KEYSTORE_PASS"
    echo "密钥密码: $KEY_PASS"
    
    return 0
}

# 自定义签名模式处理
advanced_mode() {
    echo -e "\n${COLOR_TITLE}===== 自定义签名模式 =====${COLOR_RESET}"
    
    # 扫描并选择APK文件
    if ! select_apk; then
        return 1
    fi
    
    # 获取用户输入的签名信息
    echo -en "${COLOR_INPUT}请输入密钥库路径 [默认: ./apk.keystore]: ${COLOR_RESET}"
    read KEYSTORE_PATH
    KEYSTORE_PATH=${KEYSTORE_PATH:-"./apk.keystore"}
    
    echo -en "${COLOR_INPUT}请输入密钥别名 [默认: apk]: ${COLOR_RESET}"
    read ALIAS
    ALIAS=${ALIAS:-"apk"}
    
    echo -en "${COLOR_INPUT}请输入密钥库密码 [默认: 123456]: ${COLOR_RESET}"
    read -s KEYSTORE_PASS
    KEYSTORE_PASS=${KEYSTORE_PASS:-"123456"}
    echo
    
    echo -en "${COLOR_INPUT}请输入密钥密码 [默认: 123456]: ${COLOR_RESET}"
    read -s KEY_PASS
    KEY_PASS=${KEY_PASS:-"123456"}
    echo
    
    echo -e "${COLOR_SUCCESS}使用以下配置:${COLOR_RESET}"
    echo "APK路径: $APK_PATH"
    echo "密钥库: $KEYSTORE_PATH"
    echo "别名: $ALIAS"
    echo "密钥库密码: $KEYSTORE_PASS"
    echo "密钥密码: $KEY_PASS"
    
    return 0
}

# ================================
# 加固处理流程
# ================================
perform_reinforcement() {
    echo -e "\n${COLOR_STEP}[步骤1/5] 准备加固环境...${COLOR_RESET}"
    # 复制APK到工作目录
    cp "$APK_PATH" "$IDENTIFIER.apk" || {
        echo -e "${COLOR_ERROR}错误：无法复制APK文件！${COLOR_RESET}"
        return 1
    }

    echo -e "${COLOR_STEP}[步骤2/5] 执行加固操作...${COLOR_RESET}"
    java -jar jiaguLib.jar "$IDENTIFIER.apk" keystore.cfg "$IDENTIFIER" || {
        echo -e "${COLOR_ERROR}错误：加固过程失败！${COLOR_RESET}"
        return 1
    }

    echo -e "${COLOR_STEP}[步骤3/5] 对齐APK文件...${COLOR_RESET}"
    dxtool/zipalign -f -v 4 "temp/$IDENTIFIER/$IDENTIFIER.apk" "temp/$IDENTIFIER/${IDENTIFIER}_z.apk" || {
        echo -e "${COLOR_ERROR}错误：APK对齐失败！${COLOR_RESET}"
        return 1
    }

    echo -e "${COLOR_STEP}[步骤4/5] 签名APK文件...${COLOR_RESET}"
    java -jar ../rt/apksigner.jar sign \
      --min-sdk-version 24 \
      --max-sdk-version 33 \
      --ks "$KEYSTORE_PATH" \
      --ks-key-alias "$ALIAS" \
      --ks-pass "pass:$KEYSTORE_PASS" \
      --key-pass "pass:$KEY_PASS" \
      --out "temp/$IDENTIFIER/${IDENTIFIER}_signed.apk" \
      "temp/$IDENTIFIER/${IDENTIFIER}_z.apk" || {
        echo -e "${COLOR_ERROR}错误：APK签名失败！${COLOR_RESET}"
        return 1
    }

    echo -e "${COLOR_STEP}[步骤5/5] 完成并清理...${COLOR_RESET}"
    # 确保out目录存在
    mkdir -p out
    
    # 生成输出文件名（保留原文件名）
    OUTPUT_APK="out/$(basename "$APK_PATH")"
    
    # 复制加固后的APK到out目录
    cp "temp/$IDENTIFIER/${IDENTIFIER}_signed.apk" "$OUTPUT_APK" || {
        echo -e "${COLOR_ERROR}错误：无法复制签名后的APK！${COLOR_RESET}"
        return 1
    }

    # 清理临时文件
    rm -rf "$IDENTIFIER.apk" "temp/$IDENTIFIER"

    echo -e "\n${COLOR_SUCCESS}加固完成！文件已保存到: $OUTPUT_APK${COLOR_RESET}"
    echo -e "${COLOR_WARNING}签名信息:${COLOR_RESET}"
    echo "  密钥库: $(basename "$KEYSTORE_PATH")"
    echo "  别名: $ALIAS"
    keytool -list -v -keystore "$KEYSTORE_PATH" -storepass "$KEYSTORE_PASS" -alias "$ALIAS" | grep "Valid from"
}

# ================================
# 主程序
# ================================
main() {
    # 显示标题
    show_header
    
    # 确保out目录存在
    mkdir -p out
    
    # 主循环
    while true; do
        show_menu
        read choice
        
        case $choice in
            1)
                if simple_mode; then
                    perform_reinforcement
                fi
                ;;
            2)
                if advanced_mode; then
                    perform_reinforcement
                fi
                ;;
            3)
                echo -e "${COLOR_WARNING}已退出普通加固工具${COLOR_RESET}"
                exit 0
                ;;
            *)
                echo -e "${COLOR_ERROR}错误：无效选项，请重新选择！${COLOR_RESET}"
                ;;
        esac
        
        # 询问是否继续
        echo -en "\n${COLOR_INPUT}是否继续操作？[y/n]: ${COLOR_RESET}"
        read continue_choice
        if [[ ! "$continue_choice" =~ ^[Yy]$ ]]; then
            echo -e "${COLOR_WARNING}已退出加固工具${COLOR_RESET}"
            exit 0
        fi
    done
}

# 启动主程序
main