#!/bin/bash
# KernelSU Module Builder Tool
# 模块构建工具 - 自动化构建KernelSU模块

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
USR_DIR="$(dirname "$SCRIPT_DIR")"
TEMPLATE_DIR="$USR_DIR/share/templates"
LIB_DIR="$USR_DIR/lib"

# 导入公共函数
if [ -f "$LIB_DIR/common-functions.sh" ]; then
    source "$LIB_DIR/common-functions.sh"
fi

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_debug() {
    if [ "${DEBUG:-0}" = "1" ]; then
        echo -e "${PURPLE}[DEBUG]${NC} $1"
    fi
}

log_step() {
    echo -e "${CYAN}[STEP]${NC} $1"
}

show_help() {
    cat << EOF
KernelSU Module Builder Tool - 模块构建工具

用法: $0 [选项] <输出目录>

选项:
    -h, --help              显示此帮助信息
    -i, --id ID             模块ID (必需)
    -n, --name NAME         模块名称 (必需)
    -a, --author AUTHOR     作者名称 (默认: $(whoami))
    -v, --version VER       版本号 (默认: v1.0.0)
    -d, --desc DESC         模块描述
    -t, --template TPL      使用指定模板 (默认: basic)
    -w, --webui             启用WebUI功能
    -s, --service           添加服务脚本
    -p, --post-fs           添加post-fs-data脚本
    -b, --boot              添加boot-completed脚本
    -c, --customize         添加customize脚本
    -u, --uninstall         添加uninstall脚本
    --min-api API           最小API级别 (默认: 21)
    --max-api API           最大API级别 (默认: 35)
    --min-magisk VER        最小Magisk版本 (默认: 20000)
    --min-kernelsu VER      最小KernelSU版本 (默认: 10000)
    --arch ARCH             支持的架构 (arm64,arm,x86,x64)
    --force                 强制覆盖已存在的目录
    --debug                 启用调试输出
    --dry-run               只显示将要执行的操作，不实际创建文件

模板类型:
    basic                   基础模块 (仅包含module.prop)
    systemless              无系统模块 (适用于系统文件替换)
    webui                   Web界面模块 (包含完整的WebUI)
    service                 服务模块 (包含后台服务)
    replacement             替换模块 (替换系统文件)
    modification            修改模块 (修改系统行为)
    addon                   插件模块 (为其他应用添加功能)

示例:
    $0 -i com.example.test -n "Test Module" -a "John Doe" ./test-module
    $0 --template webui --webui -i com.example.ui -n "UI Module" ./ui-module
    $0 -t service -s -p -b -i com.example.service -n "Service Module" ./service-module

环境变量:
    MODULE_AUTHOR           默认作者名称
    MODULE_TEMPLATE_DIR     模板目录路径
    DEBUG                   启用调试模式 (1/0)
EOF
}
    echo ""
    echo "示例:"
    echo "  $0 -i my_module -n \"My Module\" -a \"Author\" ./output"
    echo ""
}

# 默认配置
DEFAULT_AUTHOR="${MODULE_AUTHOR:-$(whoami)}"
DEFAULT_VERSION="v1.0.0"
DEFAULT_TEMPLATE="basic"
DEFAULT_MIN_API="21"
DEFAULT_MAX_API="35"
DEFAULT_MIN_MAGISK="20000"
DEFAULT_MIN_KERNELSU="10000"
DEFAULT_ARCH="arm64"

# 构建配置
MODULE_ID=""
MODULE_NAME=""
MODULE_AUTHOR="$DEFAULT_AUTHOR"
MODULE_VERSION="$DEFAULT_VERSION"
MODULE_DESCRIPTION=""
MODULE_TEMPLATE="$DEFAULT_TEMPLATE"
OUTPUT_DIR=""
ENABLE_WEBUI=0
ENABLE_SERVICE=0
ENABLE_POST_FS=0
ENABLE_BOOT=0
ENABLE_CUSTOMIZE=0
ENABLE_UNINSTALL=0
MIN_API="$DEFAULT_MIN_API"
MAX_API="$DEFAULT_MAX_API"
MIN_MAGISK="$DEFAULT_MIN_MAGISK"
MIN_KERNELSU="$DEFAULT_MIN_KERNELSU"
SUPPORTED_ARCH="$DEFAULT_ARCH"
FORCE_OVERWRITE=0
DRY_RUN=0

# 解析命令行参数
parse_arguments() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -i|--id)
                MODULE_ID="$2"
                shift 2
                ;;
            -n|--name)
                MODULE_NAME="$2"
                shift 2
                ;;
            -a|--author)
                MODULE_AUTHOR="$2"
                shift 2
                ;;
            -v|--version)
                MODULE_VERSION="$2"
                shift 2
                ;;
            -d|--desc)
                MODULE_DESCRIPTION="$2"
                shift 2
                ;;
            -t|--template)
                MODULE_TEMPLATE="$2"
                shift 2
                ;;
            -w|--webui)
                ENABLE_WEBUI=1
                shift
                ;;
            -s|--service)
                ENABLE_SERVICE=1
                shift
                ;;
            -p|--post-fs)
                ENABLE_POST_FS=1
                shift
                ;;
            -b|--boot)
                ENABLE_BOOT=1
                shift
                ;;
            -c|--customize)
                ENABLE_CUSTOMIZE=1
                shift
                ;;
            -u|--uninstall)
                ENABLE_UNINSTALL=1
                shift
                ;;
            --min-api)
                MIN_API="$2"
                shift 2
                ;;
            --max-api)
                MAX_API="$2"
                shift 2
                ;;
            --min-magisk)
                MIN_MAGISK="$2"
                shift 2
                ;;
            --min-kernelsu)
                MIN_KERNELSU="$2"
                shift 2
                ;;
            --arch)
                SUPPORTED_ARCH="$2"
                shift 2
                ;;
            --force)
                FORCE_OVERWRITE=1
                shift
                ;;
            --debug)
                DEBUG=1
                shift
                ;;
            --dry-run)
                DRY_RUN=1
                shift
                ;;
            -*)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
            *)
                if [ -z "$OUTPUT_DIR" ]; then
                    OUTPUT_DIR="$1"
                else
                    log_error "多余的参数: $1"
                    exit 1
                fi
                shift
                ;;
        esac
    done
}

# 验证参数
validate_arguments() {
    # 检查必需参数
    if [ -z "$MODULE_ID" ]; then
        log_error "缺少必需参数: --id"
        return 1
    fi
    
    if [ -z "$MODULE_NAME" ]; then
        log_error "缺少必需参数: --name"
        return 1
    fi
    
    if [ -z "$OUTPUT_DIR" ]; then
        log_error "缺少输出目录参数"
        return 1
    fi
    
    # 验证模块ID
    if ! validate_module_id "$MODULE_ID"; then
        return 1
    fi
    
    # 验证版本号
    if ! validate_version "$MODULE_VERSION"; then
        return 1
    fi
    
    # 验证模板类型
    case "$MODULE_TEMPLATE" in
        basic|systemless|webui|service|replacement|modification|addon)
            ;;
        *)
            log_error "无效的模板类型: $MODULE_TEMPLATE"
            log_error "支持的模板: basic, systemless, webui, service, replacement, modification, addon"
            return 1
            ;;
    esac
    
    # 设置默认描述
    if [ -z "$MODULE_DESCRIPTION" ]; then
        MODULE_DESCRIPTION="$MODULE_NAME - KernelSU模块"
    fi
    
    return 0
}

# 错误处理
error_exit() {
    log_error "$1"
    exit 1
}

# 清理函数
cleanup() {
    # 清理临时文件
    if [ -n "${TEMP_DIR:-}" ] && [ -d "$TEMP_DIR" ]; then
        rm -rf "$TEMP_DIR"
    fi
}

# 设置信号处理
trap cleanup EXIT INT TERM

# 主函数
main() {
    log_info "KernelSU Module Builder Tool v1.0.0"
    
    # 解析参数
    parse_arguments "$@"
    
    # 验证参数
    if ! validate_arguments; then
        log_error "参数验证失败"
        exit 1
    fi
    
    # 显示构建信息
    if [ "$DEBUG" = "1" ]; then
        log_debug "构建配置:"
        log_debug "  模块ID: $MODULE_ID"
        log_debug "  模块名称: $MODULE_NAME"
        log_debug "  作者: $MODULE_AUTHOR"
        log_debug "  版本: $MODULE_VERSION"
        log_debug "  描述: $MODULE_DESCRIPTION"
        log_debug "  模板: $MODULE_TEMPLATE"
        log_debug "  输出目录: $OUTPUT_DIR"
        log_debug "  WebUI: $ENABLE_WEBUI"
        log_debug "  Service: $ENABLE_SERVICE"
        log_debug "  Post-FS: $ENABLE_POST_FS"
        log_debug "  Boot: $ENABLE_BOOT"
        log_debug "  Customize: $ENABLE_CUSTOMIZE"
        log_debug "  Uninstall: $ENABLE_UNINSTALL"
        log_debug "  强制覆盖: $FORCE_OVERWRITE"
        log_debug "  模拟运行: $DRY_RUN"
    fi
    
    # 构建模块
    if ! build_module "$OUTPUT_DIR"; then
        error_exit "模块构建失败"
    fi
    
    log_success "操作完成"
}

# 如果直接运行脚本，执行主函数
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi
