#!/bin/bash

# 完善的构建脚本模板
# 此脚本会被 handle_script 方法自动更新参数

# 设置工作区路径和基本参数
WORKSPACE_PATH="XXGPlayKit.xcworkspace"
SDK_NAME="DemandProstitute"
SDK_VERSION="v3.4.0"
CN_OR_OS="国内版"
SCHEME_NAME="XXGPlayKitCNDemo"
BUILD_DIR="build"  # 存放构建文件的目录
SDK_DIR="SDK"      # 目标SDK目录
EXCLUDE_PATTERN="*Test*"  # 排除测试相关的文件

# 需要导出的 .a 文件白名单（由混淆工具 handle_script 动态注入）
# 例如: EXPORTED_LIBS=("libMetabolicVolumeCentralDownFunnelBankers.a" "libHowClockDrySampleContentsMetric.a")
EXPORTED_LIBS=("libMetabolicVolumeCentralDownFunnelBankers.a" "libHowClockDrySampleContentsMetric.a")

# 构建选项
SILENT_BUILD=true  # 是否静默构建（忽略详细输出）
SHOW_PROGRESS=true # 是否显示进度
DEEP_CLEAN=false   # 是否进行深度清理（清理 Xcode 缓存）

# 颜色输出函数
print_info() {
    echo -e "\033[32m[INFO]\033[0m $1"
}

print_error() {
    echo -e "\033[31m[ERROR]\033[0m $1"
}

print_warning() {
    echo -e "\033[33m[WARNING]\033[0m $1"
}

# 检查必要的工具和文件
check_prerequisites() {
    print_info "检查构建环境..."

    # 检查 xcodebuild 是否可用
    if ! command -v xcodebuild &> /dev/null; then
        print_error "xcodebuild 未找到，请确保已安装 Xcode"
        exit 1
    fi

    # 检查工作区文件是否存在
    if [ ! -d "$WORKSPACE_PATH" ]; then
        print_error "工作区目录不存在: $WORKSPACE_PATH"
        exit 1
    fi

    print_info "环境检查通过"
}

# Pods 模式下，构建前先在 Demo 目录执行一次 pod install，
# 确保本地 Pods 工程、workspace、Podfile.lock 同步。
prepare_pods_before_build() {
    if [ "$SCHEME_NAME" != "XXGPlayKitOSDemo-Pods" ]; then
        return
    fi

    if ! command -v pod &> /dev/null; then
        print_error "当前为 Pods 模式，但未找到 pod 命令"
        exit 1
    fi

    if [ ! -d "XXGPlayKitOSDemo" ] || [ ! -f "XXGPlayKitOSDemo/Podfile" ]; then
        print_error "当前为 Pods 模式，但 XXGPlayKitOSDemo/Podfile 不存在"
        exit 1
    fi

    print_info "Pods 模式：构建前先在 XXGPlayKitOSDemo 执行 pod install..."
    (
        cd "XXGPlayKitOSDemo" && pod install
    )

    if [ $? -ne 0 ]; then
        print_error "构建前执行 pod install 失败"
        exit 1
    fi

    print_info "构建前 Pods 依赖同步完成"
}

# 清理旧的构建文件
clean_build() {
    print_info "清理旧的构建文件..."

    # 清理构建目录
    if [ -d "$BUILD_DIR" ]; then
        rm -rf "$BUILD_DIR"
        print_info "已删除旧的构建目录: $BUILD_DIR"
    fi

    # 清理SDK目录
    if [ -d "$SDK_DIR" ]; then
        rm -rf "$SDK_DIR"
        print_info "已删除旧的SDK目录: $SDK_DIR"
    fi

    # 创建新的构建目录
    mkdir -p "$BUILD_DIR"
    mkdir -p "$SDK_DIR"


    # 可选的深度清理（清理 Xcode 缓存）
    if [ "$DEEP_CLEAN" = true ]; then
        print_info "进行深度清理 - 清理 Xcode 项目缓存..."
        xcodebuild clean -workspace "$WORKSPACE_PATH" -scheme "$SCHEME_NAME" -configuration Release
        print_info "深度清理完成"
    else
        print_info "跳过 Xcode 缓存清理（xcodebuild clean build 会自动处理）"
    fi

    print_info "清理完成"
}

# 构建项目
build_project() {
    print_info "开始构建 $SCHEME_NAME (Release 配置)..."

    # 创建日志文件
    LOG_FILE="$BUILD_DIR/build.log"
    mkdir -p "$BUILD_DIR"

    if [ "$SILENT_BUILD" = true ]; then
        # 静默构建模式
        build_project_silent
    else
        # 详细输出模式
        build_project_verbose
    fi
}

# 静默构建（推荐）
build_project_silent() {
    # 显示进度的函数
    show_progress() {
        local step=$1
        local total=$2
        local message=$3
        local percent=$((step * 100 / total))
        if [ "$SHOW_PROGRESS" = true ]; then
            printf "\r\033[32m[进度]\033[0m [%3d%%] %s" "$percent" "$message"
        fi
    }

    # 开始构建进度显示
    show_progress 1 4 "正在清理项目..."

    # 构建项目，将详细输出重定向到日志文件
    xcodebuild -workspace "$WORKSPACE_PATH" \
               -scheme "$SCHEME_NAME" \
               -configuration Release \
               -sdk iphoneos \
               clean build \
               -derivedDataPath "$BUILD_DIR" \
               ONLY_ACTIVE_ARCH=NO \
               > "$LOG_FILE" 2>&1 &

    # 获取构建进程ID
    BUILD_PID=$!

    # 监控构建进度
    while kill -0 $BUILD_PID 2>/dev/null; do
        if [ "$SHOW_PROGRESS" = true ]; then
            # 根据日志内容显示进度
            if grep -q "Clean.Remove" "$LOG_FILE" 2>/dev/null; then
                show_progress 1 4 "正在清理项目..."
            elif grep -q "CompileC\|CompileSwift" "$LOG_FILE" 2>/dev/null; then
                show_progress 2 4 "正在编译源文件..."
            elif grep -q "Ld\|Link" "$LOG_FILE" 2>/dev/null; then
                show_progress 3 4 "正在链接..."
            elif grep -q "CodeSign\|ProcessInfoPlistFile" "$LOG_FILE" 2>/dev/null; then
                show_progress 4 4 "正在处理资源和签名..."
            fi
        fi
        sleep 1
    done

    # 等待构建完成并获取退出状态
    wait $BUILD_PID
    BUILD_RESULT=$?

    if [ "$SHOW_PROGRESS" = true ]; then
        echo  # 换行
    fi

    # 检查构建结果
    if [ $BUILD_RESULT -ne 0 ] || grep -q "BUILD FAILED" "$LOG_FILE"; then
        print_error "构建失败！详细信息请查看: $LOG_FILE"
        echo "最后几行错误信息:"
        tail -10 "$LOG_FILE"
        exit 1
    elif grep -q "BUILD SUCCEEDED" "$LOG_FILE"; then
        print_info "构建成功！详细日志保存在: $LOG_FILE"
    else
        print_warning "构建状态未知，请检查日志: $LOG_FILE"
    fi
}

# 详细输出模式（显示所有构建信息）
build_project_verbose() {
    print_info "使用详细输出模式..."

    xcodebuild -workspace "$WORKSPACE_PATH" \
               -scheme "$SCHEME_NAME" \
               -configuration Release \
               -sdk iphoneos \
               clean build \
               -derivedDataPath "$BUILD_DIR" \
               ONLY_ACTIVE_ARCH=NO | tee "$LOG_FILE"

    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        print_error "构建失败！"
        exit 1
    fi

    print_info "构建完成！详细日志保存在: $LOG_FILE"
}

# 复制框架文件（白名单模式）
# 只导出:
#   1. 与 SDK_NAME 同名的 .framework（主工程混淆后产物）
#   2. EXPORTED_LIBS 数组里列出的 .a（XXGThirdMiddlewares 各桥接 target 混淆后产物）
# 其它第三方 Pods 产物（Pods-*.a、FBAudienceNetwork.framework 等）一律不导出。
copy_frameworks() {
    print_info "按白名单复制 frameworks 和 .a 文件到 SDK 目录..."

    FRAMEWORK_DIR="$BUILD_DIR/Build/Products/Release-iphoneos"

    if [ ! -d "$FRAMEWORK_DIR" ]; then
        print_error "构建产物目录不存在: $FRAMEWORK_DIR"
        exit 1
    fi

    # 1) 复制主工程 framework: ${SDK_NAME}.framework
    MAIN_FWK_SRC=""
    # 常见路径: $FRAMEWORK_DIR/${SDK_NAME}.framework
    if [ -d "$FRAMEWORK_DIR/${SDK_NAME}.framework" ]; then
        MAIN_FWK_SRC="$FRAMEWORK_DIR/${SDK_NAME}.framework"
    else
        # 兜底: 递归查找同名 framework（忽略中间构建目录）
        MAIN_FWK_SRC=$(find "$FRAMEWORK_DIR" -type d -name "${SDK_NAME}.framework" -not -path "*/Intermediates*" | head -n 1)
    fi

    if [ -n "$MAIN_FWK_SRC" ] && [ -d "$MAIN_FWK_SRC" ]; then
        rsync -a "$MAIN_FWK_SRC" "$SDK_DIR/"
        print_info "✓ 导出主工程: ${SDK_NAME}.framework"
    else
        print_warning "✗ 未找到主工程 framework: ${SDK_NAME}.framework"
    fi

    # 2) 按白名单复制 XXGThirdMiddlewares 各桥接 .a
    if [ ${#EXPORTED_LIBS[@]} -gt 0 ]; then
        print_info "按白名单导出桥接 .a 文件..."
        for lib in "${EXPORTED_LIBS[@]}"; do
            SRC="$FRAMEWORK_DIR/$lib"
            if [ -f "$SRC" ]; then
                cp "$SRC" "$SDK_DIR/"
                print_info "  ✓ 导出: $lib"
            else
                # 兜底: 递归查找（忽略中间目录）
                FOUND=$(find "$FRAMEWORK_DIR" -type f -name "$lib" -not -path "*/Intermediates*" | head -n 1)
                if [ -n "$FOUND" ]; then
                    cp "$FOUND" "$SDK_DIR/"
                    print_info "  ✓ 导出(兜底路径): $lib"
                else
                    print_warning "  ✗ 未找到预期的桥接库: $lib"
                fi
            fi
        done
    else
        print_warning "EXPORTED_LIBS 为空，跳过 .a 白名单导出（请检查混淆工具是否正确注入白名单）"
    fi

    print_info "框架文件复制完成"
}

# 复制资源文件
copy_resources() {
    print_info "复制资源文件..."

    # 1. 复制 ${SDK_NAME}.bundle 整个文件夹到 $SDK_DIR
    if [ -d "${SDK_NAME}.bundle" ]; then
        # 确保复制整个文件夹，而不是文件夹内容
        cp -R "${SDK_NAME}.bundle" "$SDK_DIR/"
        print_info "已复制整个 ${SDK_NAME}.bundle 文件夹到 $SDK_DIR"

        # 验证复制结果
        if [ -d "$SDK_DIR/${SDK_NAME}.bundle" ]; then
            print_info "✅ 验证成功: $SDK_DIR/${SDK_NAME}.bundle 存在"
        else
            print_error "❌ 复制失败: $SDK_DIR/${SDK_NAME}.bundle 不存在"
        fi
    else
        print_warning "${SDK_NAME}.bundle 不存在，跳过"
    fi

    # 2. 根据版本类型复制对应的 Frameworks 和 Resources
    if [ "$CN_OR_OS" = "国内版" ]; then
        # 国内版：复制 CNFrameworks 和 CNResources
        if [ -d "CNFrameworks" ]; then
            cp -R "CNFrameworks" "$SDK_DIR/"
            print_info "已复制 CNFrameworks 到 $SDK_DIR"
        else
            print_warning "CNFrameworks 不存在，跳过"
        fi

        if [ -d "CNResources" ]; then
            cp -R "CNResources" "$SDK_DIR/"
            print_info "已复制 CNResources 到 $SDK_DIR"
        else
            print_warning "CNResources 不存在，跳过"
        fi
    else
        # 国际版：复制 OSFrameworks 和 OSResources
        if [ -d "OSFrameworks" ]; then
            cp -R "OSFrameworks" "$SDK_DIR/"
            print_info "已复制 OSFrameworks 到 $SDK_DIR"
        else
            print_warning "OSFrameworks 不存在，跳过"
        fi

        if [ -d "OSResources" ]; then
            cp -R "OSResources" "$SDK_DIR/"
            print_info "已复制 OSResources 到 $SDK_DIR"
        else
            print_warning "OSResources 不存在，跳过"
        fi
    fi

    print_info "资源文件复制完成"
    print_info "SDK目录内容:"
    ls -la "$SDK_DIR"
}

# 创建最终的 SDK 包：复制 Demo 项目并重命名为 FINAL_NAME，然后在其目录下添加文档和 SDK 文件
create_sdk_package() {
    print_info "创建最终的 SDK 包..."

    # 最终 SDK 包名称
    FINAL_NAME="闲闲SDK-iOS-${CN_OR_OS}-${SDK_NAME}-${SDK_VERSION}"
    DEST_PATH="../${FINAL_NAME}"

    # 打包时使用实际 Demo 文件夹名，而不是 Scheme 名
    # 带 Pods 和不带 Pods 时，海外版目录都固定为 XXGPlayKitOSDemo
    if [ "$CN_OR_OS" = "国内版" ]; then
        DEMO_DIR="XXGPlayKitCNDemo"
    else
        DEMO_DIR="XXGPlayKitOSDemo"
    fi

    # 如果已存在同名目录，先删除
    if [ -d "$DEST_PATH" ]; then
        rm -rf "$DEST_PATH"
        print_info "已删除旧的 SDK 包目录: $DEST_PATH"
    fi

    # 1. 复制 Demo 项目并重命名
    if [ -d "$DEMO_DIR" ]; then
        cp -R "$DEMO_DIR" "$DEST_PATH"
        print_info "已复制 Demo 项目并重命名为: $FINAL_NAME"
    else
        print_warning "Demo 项目目录不存在: $DEMO_DIR"
        return 1
    fi

    # 1.1 若 Demo 内包含 Podfile，整理 Podfile:
    #     - workspace '../XXGPlayKit.xcworkspace' -> workspace 'XXGPlayKit.xcworkspace'
    #     - 移除引用 ../XXGThirdMiddlewares/... 的整个 target 块（该 target 只用于混淆构建，
    #       发给使用方的 Demo 里不需要）
    PODFILE_PATH="$DEST_PATH/Podfile"
    if [ -f "$PODFILE_PATH" ]; then
        # 替换 workspace 路径
        sed -i '' "s|workspace '\\.\\./XXGPlayKit\\.xcworkspace'|workspace 'XXGPlayKit.xcworkspace'|g" "$PODFILE_PATH"

        # 用 awk 按块级方式剔除引用 XXGThirdMiddlewares 的 target
        awk '
            BEGIN { in_target = 0; buf = ""; is_mw = 0 }
            /^target / {
                if (in_target == 1 && is_mw == 0) { print buf }
                in_target = 1; buf = $0; is_mw = 0; next
            }
            in_target == 1 {
                buf = buf "\n" $0
                if ($0 ~ /XXGThirdMiddlewares/) is_mw = 1
                if ($0 ~ /^end[[:space:]]*$/) {
                    if (is_mw == 0) print buf
                    in_target = 0; buf = ""; is_mw = 0
                }
                next
            }
            { print }
            END { if (in_target == 1 && is_mw == 0) print buf }
        ' "$PODFILE_PATH" > "$PODFILE_PATH.tmp" && mv "$PODFILE_PATH.tmp" "$PODFILE_PATH"

        print_info "已整理 Podfile: $PODFILE_PATH"

        # Pods 版最终交付 Demo 需要再次执行 pod install，
        # 让整理后的 Podfile 与 Pods 工程/workspace 保持同步。
        if [ "$SCHEME_NAME" = "XXGPlayKitOSDemo-Pods" ]; then
            print_info "在最终 SDK 包中执行 pod install..."
            (
                cd "$DEST_PATH" && pod install
            )

            if [ $? -ne 0 ]; then
                print_error "最终 SDK 包中的 pod install 失败: $DEST_PATH"
                return 1
            fi

            print_info "最终 SDK 包 Pods 依赖同步完成"
        fi
    fi

    # 2. 复制 SDK 对接文档到新目录
    if [ -d "SDK对接文档" ]; then
        cp -R "SDK对接文档" "${DEST_PATH}/"
        print_info "已复制 SDK对接文档 到: ${DEST_PATH}/SDK对接文档"
    else
        print_warning "SDK对接文档目录不存在，跳过"
    fi

    # 3. 复制构建的 SDK 文件夹到新目录
    if [ -d "$SDK_DIR" ]; then
        cp -R "$SDK_DIR" "${DEST_PATH}/"
        print_info "已复制构建输出 SDK 目录 到: ${DEST_PATH}/$(basename "$SDK_DIR")"
    else
        print_error "构建输出 SDK 目录不存在: $SDK_DIR"
        return 1
    fi

    # 4. 清理 Demo 工程中的旧三方引用，并把最终导出的 SDK 文件夹重新加入工程
    sync_sdk_into_demo_project "$DEST_PATH"
    if [ $? -ne 0 ]; then
        return 1
    fi

    print_info "SDK 包创建完成: $DEST_PATH"
}

# 同步最终 SDK 包中的 Demo 工程引用
sync_sdk_into_demo_project() {
    local dest_path="$1"
    local target_pbxproj=""
    local sdk_folder_path="$dest_path/$(basename "$SDK_DIR")"
    local clean_script="scripts/custom_pbxproj_clean.py"
    local add_script="scripts/custom_pbxproj_add.py"
    local py_cmd=""
    local exported_libs_csv=""

    if command -v python3 >/dev/null 2>&1; then
        py_cmd="python3"
    elif command -v python >/dev/null 2>&1; then
        py_cmd="python"
    else
        print_error "未找到 python3/python，无法同步最终 Demo 工程的 SDK 引用"
        return 1
    fi

    if [ ! -f "$clean_script" ]; then
        print_error "清理脚本不存在: $clean_script"
        return 1
    fi

    if [ ! -f "$add_script" ]; then
        print_error "添加脚本不存在: $add_script"
        return 1
    fi

    if [ "$CN_OR_OS" = "国内版" ]; then
        target_pbxproj="$dest_path/XXGPlayKitCNDemo.xcodeproj/project.pbxproj"
    else
        if [ "$SCHEME_NAME" = "XXGPlayKitOSDemo-Pods" ]; then
            target_pbxproj="$dest_path/XXGPlayKitOSDemo-Pods.xcodeproj/project.pbxproj"
        else
            target_pbxproj="$dest_path/XXGPlayKitOSDemo.xcodeproj/project.pbxproj"
        fi
    fi

    if [ ! -f "$target_pbxproj" ]; then
        print_error "目标 pbxproj 不存在: $target_pbxproj"
        return 1
    fi

    if [ ! -d "$sdk_folder_path" ]; then
        print_error "最终包内 SDK 目录不存在: $sdk_folder_path"
        return 1
    fi

    if [ ${#EXPORTED_LIBS[@]} -gt 0 ]; then
        local IFS=,
        exported_libs_csv="${EXPORTED_LIBS[*]}"
    fi

    print_info "同步最终 Demo 工程的 SDK 引用..."
    print_info "目标工程: $target_pbxproj"
    print_info "SDK 目录: $sdk_folder_path"

    "$py_cmd" "$clean_script" "$target_pbxproj" "$SDK_NAME" "../$(basename "$SDK_DIR")" "SDK" "$exported_libs_csv"
    if [ $? -ne 0 ]; then
        print_error "清理旧 pbxproj 引用失败"
        return 1
    fi

    "$py_cmd" "$add_script" "$target_pbxproj" "$sdk_folder_path" "SDK"
    if [ $? -ne 0 ]; then
        print_error "添加 SDK 文件夹到 pbxproj 失败"
        return 1
    fi

    print_info "最终 Demo 工程 SDK 引用同步完成"
}

# 显示构建信息
show_build_info() {
    print_info "构建信息:"
    echo "  工作区: $WORKSPACE_PATH"
    echo "  SDK名称: $SDK_NAME"
    echo "  SDK版本: $SDK_VERSION"
    echo "  版本类型: $CN_OR_OS"
    echo "  Scheme: $SCHEME_NAME"
    echo "  构建目录: $BUILD_DIR"
    echo "  SDK目录: $SDK_DIR"
}

# 主函数
main() {
    print_info "开始构建 SDK..."

    # 显示构建信息
    show_build_info

    # 执行构建步骤
    check_prerequisites
    prepare_pods_before_build
    clean_build
    build_project
    copy_frameworks
    copy_resources
    create_sdk_package

    print_info "🎉 构建和打包完成！"
    print_info "最终 SDK 包位置: ../闲闲SDK-iOS-${CN_OR_OS}-${SDK_NAME}-${SDK_VERSION}"
}

# 执行主函数
main "$@"
