#!/bin/bash

# 脚本：收集构建产物并按照插件类型和平台组织
# 用途：执行构建后，将各平台的插件文件复制到 output 目录
# 输出结构：
#   output/
#     child/
#       aarch64-apple-darwin/
#       x86_64-apple-darwin/
#       x86_64-pc-windows-gnu/
#       aarch64-unknown-linux-musl/
#       x86_64-unknown-linux-musl/
#       aarch64-unknown-linux-gnu/
#       x86_64-unknown-linux-gnu/
#     parent/
#       aarch64-apple-darwin/
#       x86_64-apple-darwin/
#       x86_64-pc-windows-gnu/
#       aarch64-unknown-linux-musl/
#       x86_64-unknown-linux-musl/
#       aarch64-unknown-linux-gnu/
#       x86_64-unknown-linux-gnu/

set -e  # 遇到错误立即退出

# 获取脚本所在目录（项目根目录）
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

echo "=========================================="
echo "开始执行构建和文件收集流程"
echo "=========================================="

# 步骤1: 执行 make build-all
echo ""
echo "步骤 1: 执行 make build-all..."
make build-all

if [ $? -ne 0 ]; then
    echo "错误: make build-all 执行失败"
    exit 1
fi

echo "✓ 构建完成"

# 步骤2-7: 复制文件到 output 目录
echo ""
echo "步骤 2-7: 复制文件到 output 目录..."

# 定义输出根目录
OUTPUT_DIR="$SCRIPT_DIR/output"

# 清理并创建输出目录
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR/child"
mkdir -p "$OUTPUT_DIR/parent"

# 函数：从 plugin.toml 读取 metadata.name
get_plugin_name() {
    local plugin_toml="$1"
    if [ -f "$plugin_toml" ]; then
        # 使用 sed 提取 [metadata] 部分的 name 值
        # 先找到 [metadata] 部分，然后提取该部分下的 name 行
        sed -n '/^\[metadata\]/,/^\[/p' "$plugin_toml" | grep -E '^\s*name\s*=' | grep -oE '"[^"]+"' | tr -d '"' | head -1
    else
        echo ""
    fi
}

# 读取 child 和 parent 插件的名称
CHILD_PLUGIN_TOML="$SCRIPT_DIR/example/child-plugin/plugin.toml"
PARENT_PLUGIN_TOML="$SCRIPT_DIR/example/parent-plugin/plugin.toml"
CHILD_PLUGIN_NAME=$(get_plugin_name "$CHILD_PLUGIN_TOML")
PARENT_PLUGIN_NAME=$(get_plugin_name "$PARENT_PLUGIN_TOML")

if [ -z "$CHILD_PLUGIN_NAME" ]; then
    echo "  警告: 无法从 $CHILD_PLUGIN_TOML 读取 metadata.name"
fi
if [ -z "$PARENT_PLUGIN_NAME" ]; then
    echo "  警告: 无法从 $PARENT_PLUGIN_TOML 读取 metadata.name"
fi

# 定义平台配置
# 格式: "平台名称:源目录:文件模式:child文件名:parent文件名"
declare -a PLATFORMS=(
    "aarch64-apple-darwin:target/aarch64-apple-darwin/release:lib*.dylib:libchild_plugin.dylib:libparent_plugin.dylib"
    "x86_64-apple-darwin:target/x86_64-apple-darwin/release:lib*.dylib:libchild_plugin.dylib:libparent_plugin.dylib"
    "x86_64-pc-windows-gnu:target/x86_64-pc-windows-gnu/release:*.dll:child_plugin.dll:parent_plugin.dll"
    "aarch64-unknown-linux-musl:target/aarch64-unknown-linux-musl/release:lib*.so:libchild_plugin.so:libparent_plugin.so"
    "x86_64-unknown-linux-musl:target/x86_64-unknown-linux-musl/release:lib*.so:libchild_plugin.so:libparent_plugin.so"
    "aarch64-unknown-linux-gnu:target/aarch64-unknown-linux-gnu/release:lib*.so:libchild_plugin.so:libparent_plugin.so"
    "x86_64-unknown-linux-gnu:target/x86_64-unknown-linux-gnu/release:lib*.so:libchild_plugin.so:libparent_plugin.so"
)

# 遍历每个平台
for platform_config in "${PLATFORMS[@]}"; do
    IFS=':' read -r platform_name source_dir file_pattern child_file parent_file <<< "$platform_config"
    
    echo ""
    echo "处理平台: $platform_name"
    
    # 创建 child 和 parent 下的平台目录
    child_platform_dir="$OUTPUT_DIR/child/$platform_name"
    parent_platform_dir="$OUTPUT_DIR/parent/$platform_name"
    mkdir -p "$child_platform_dir"
    mkdir -p "$parent_platform_dir"
    
    # 检查源目录是否存在
    full_source_dir="$SCRIPT_DIR/$source_dir"
    if [ ! -d "$full_source_dir" ]; then
        echo "  警告: 源目录不存在: $full_source_dir"
        continue
    fi
    
    # 复制 child 插件文件
    if [ -f "$full_source_dir/$child_file" ]; then
        # 获取原文件的扩展名
        child_ext="${child_file##*.}"
        # 检查原文件名是否有 lib 前缀
        child_prefix=""
        if [[ "$child_file" == lib* ]]; then
            child_prefix="lib"
        fi
        # 使用 plugin.toml 中的 name 作为新文件名
        if [ -n "$CHILD_PLUGIN_NAME" ]; then
            child_new_name="${child_prefix}${CHILD_PLUGIN_NAME}.${child_ext}"
        else
            # 如果无法读取 name，使用原文件名
            child_new_name="$child_file"
        fi
        cp "$full_source_dir/$child_file" "$child_platform_dir/$child_new_name"
        echo "  ✓ 复制 child: $child_file -> child/$platform_name/$child_new_name"
    else
        echo "  警告: 未找到 child 文件: $full_source_dir/$child_file"
    fi
    
    # 复制 parent 插件文件
    if [ -f "$full_source_dir/$parent_file" ]; then
        # 获取原文件的扩展名
        parent_ext="${parent_file##*.}"
        # 检查原文件名是否有 lib 前缀
        parent_prefix=""
        if [[ "$parent_file" == lib* ]]; then
            parent_prefix="lib"
        fi
        # 使用 plugin.toml 中的 name 作为新文件名
        if [ -n "$PARENT_PLUGIN_NAME" ]; then
            parent_new_name="${parent_prefix}${PARENT_PLUGIN_NAME}.${parent_ext}"
        else
            # 如果无法读取 name，使用原文件名
            parent_new_name="$parent_file"
        fi
        cp "$full_source_dir/$parent_file" "$parent_platform_dir/$parent_new_name"
        echo "  ✓ 复制 parent: $parent_file -> parent/$platform_name/$parent_new_name"
    else
        echo "  警告: 未找到 parent 文件: $full_source_dir/$parent_file"
    fi
done

echo ""
echo "=========================================="
echo "文件收集完成！"
echo "=========================================="
echo ""
echo "输出目录: $OUTPUT_DIR"
echo ""
echo "目录结构:"
tree -L 3 "$OUTPUT_DIR" 2>/dev/null || find "$OUTPUT_DIR" -type f | sort

echo ""
echo "=========================================="
echo "检查并配置密钥"
echo "=========================================="

# 步骤8: 检查并安装 pluginctl
echo ""
echo "步骤 8: 检查 pluginctl 命令..."
if ! command -v pluginctl &> /dev/null; then
    echo "  pluginctl 未安装，正在安装..."
    cargo install secra-pluginctl
    if [ $? -ne 0 ]; then
        echo "  错误: 安装 pluginctl 失败"
        exit 1
    fi
    echo "  ✓ pluginctl 安装完成"
else
    echo "  ✓ pluginctl 已安装"
fi

# 步骤9-10: 检查并生成密钥
echo ""
echo "步骤 9-10: 检查密钥文件..."
KEYS_DIR="$SCRIPT_DIR/keys"

# 检查 keys 目录是否存在，以及是否包含密钥文件
need_generate=false

if [ ! -d "$KEYS_DIR" ]; then
    # 目录不存在，需要生成
    need_generate=true
    echo "  keys 目录不存在，将创建并生成密钥..."
    mkdir -p "$KEYS_DIR"
elif [ -z "$(find "$KEYS_DIR" -maxdepth 1 -type f \( -name "*.pem" -o -name "*.key" \) 2>/dev/null)" ]; then
    # 目录存在但没有密钥文件（.pem 或 .key 文件）
    need_generate=true
    echo "  keys 目录存在但密钥文件不存在，正在生成密钥..."
else
    echo "  ✓ 密钥文件已存在"
fi

# 如果需要生成密钥
if [ "$need_generate" = true ]; then
    pluginctl keygen -o "$KEYS_DIR"
    if [ $? -ne 0 ]; then
        echo "  错误: 生成密钥失败"
        exit 1
    fi
    echo "  ✓ 密钥生成完成"
fi

# 步骤11: 打包 child-plugin
echo ""
echo "步骤 11: 打包 child-plugin..."
PLUGINS_DIR="$SCRIPT_DIR/plugins"
mkdir -p "$PLUGINS_DIR"

pluginctl pack -c ./example/child-plugin/plugin.toml
if [ $? -ne 0 ]; then
    echo "  错误: 打包 child-plugin 失败"
    exit 1
fi
echo "  ✓ child-plugin 打包完成"

# 步骤12: 打包 parent-plugin
echo ""
echo "步骤 12: 打包 parent-plugin..."
pluginctl pack -c ./example/parent-plugin/plugin.toml
if [ $? -ne 0 ]; then
    echo "  错误: 打包 parent-plugin 失败"
    exit 1
fi
echo "  ✓ parent-plugin 打包完成"

echo ""
echo "=========================================="
echo "所有步骤完成！"
echo "=========================================="

