#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: sync-trae-skills.sh
# 脚本描述: 将工程团队集中管理的 AI 技能库规则一键同步到本地开发项目的 .trae/rules/
# 适用工具: Trae AI (基于 VS Code 的 AI 编程助手)
# 编写原则: 幂等性、防呆设计、多环境适配、清晰提示
# ==============================================================================

set -euo pipefail

SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)

# 默认配置
DEFAULT_SOURCE_DIR=$(cd "$SCRIPT_DIR/.." &>/dev/null && pwd) # 默认技能库源目录为脚本所在仓库
DEFAULT_DEST_DIR="$PWD"                                      # 默认目标项目为当前执行目录

# ANSI 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0;89m' # No Color

# 打印帮助信息
show_help() {
    cat << EOF
使用说明:
  sync-trae-skills.sh [选项]

此脚本旨在将工程团队版本控制下的 AI 技能（rules）同步到具体业务项目的 .trae/rules/ 目录中。

选项:
  -s, --source <PATH>   集中管理的 AI 技能库目录路径 (默认: 脚本所在仓库)
  -d, --dest <PATH>     需要注入规则的目标开发项目根目录 (默认: 当前执行目录)
  -h, --help            显示此帮助信息

示例:
  # 在本地项目根目录下运行，指定外部共享技能库目录进行同步
  bash scripts/sync-trae-skills.sh --source ~/projects/ai-skills-repo --dest .
EOF
}

# 解析命令行参数
SOURCE_DIR="$DEFAULT_SOURCE_DIR"
DEST_DIR="$DEFAULT_DEST_DIR"

while [[ $# -gt 0 ]]; do
    case "$1" in
        -s|--source)
            if [[ -n "${2:-}" ]]; then
                SOURCE_DIR="$2"
                shift 2
            else
                echo -e "${RED}❌ 错误: --source 参数需要指定路径。${NC}" >&2
                exit 1
            fi
            ;;
        -d|--dest)
            if [[ -n "${2:-}" ]]; then
                DEST_DIR="$2"
                shift 2
            else
                echo -e "${RED}❌ 错误: --dest 参数需要指定路径。${NC}" >&2
                exit 1
            fi
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo -e "${RED}❌ 错误: 未知参数 '$1'。${NC}" >&2
            show_help
            exit 1
            ;;
    esac
done

# 规范化绝对路径
SOURCE_DIR=$(cd "$SOURCE_DIR" &>/dev/null && pwd || echo "$SOURCE_DIR")
DEST_DIR=$(cd "$DEST_DIR" &>/dev/null && pwd || echo "$DEST_DIR")

# 1. 核心安全与防呆检查
if [ ! -d "$SOURCE_DIR" ]; then
    echo -e "${RED}❌ 错误: 找不到指定的 AI 技能库源目录: $SOURCE_DIR${NC}" >&2
    exit 1
fi

if [ ! -d "$DEST_DIR" ]; then
    echo -e "${RED}❌ 错误: 目标开发项目目录不存在: $DEST_DIR${NC}" >&2
    exit 1
fi

TARGET_RULES_DIR="$DEST_DIR/.trae/rules"
MANIFEST_FILE="$TARGET_RULES_DIR/.ai-skills-managed-files"
NEW_MANIFEST_FILE="$TARGET_RULES_DIR/.ai-skills-managed-files.tmp"

echo -e "${BLUE}====================================================${NC}"
echo -e "${BLUE}🚀 开始为开发项目同步 Trae AI 专属技能库${NC}"
echo -e "${BLUE}📂 技能源路径: $SOURCE_DIR${NC}"
echo -e "${BLUE}📂 目标项目路径: $DEST_DIR${NC}"
echo -e "${BLUE}📂 规则注入路径: $TARGET_RULES_DIR${NC}"
echo -e "${BLUE}====================================================${NC}"

# 2. 智能探测技能库目录结构
# 兼容结构1: 源目录下直接有 .trae/rules/ (如项目内部自闭环管理)
# 兼容结构2: 源目录下是一个独立的技能仓库，包含 base/、frontend/、backend/ 等分类
IS_MONO_REPO_RULES=false
IS_STRUCTURED_RULES=false

if [ -d "$SOURCE_DIR/base" ] || [ -d "$SOURCE_DIR/frontend" ] || [ -d "$SOURCE_DIR/backend" ] || [ -d "$SOURCE_DIR/devops" ]; then
    IS_STRUCTURED_RULES=true
elif [ -d "$SOURCE_DIR/.trae/rules" ]; then
    IS_MONO_REPO_RULES=true
fi

if [ "$IS_MONO_REPO_RULES" = false ] && [ "$IS_STRUCTURED_RULES" = false ]; then
    # 如果源目录既没有 .trae/rules，也没有分类，则将源目录下所有的 .md 文件当作规则处理
    echo -e "${YELLOW}⚠️ 提示: 源目录未检测到标准的技能库分层结构，将把所有根目录 Markdown 作为规则进行平铺同步。${NC}"
fi

# 3. 创建目标规则目录
mkdir -p "$TARGET_RULES_DIR"

# 4. 清理目标目录中的旧托管规则，保留用户自定义 Markdown 文件
SYNC_COUNT=0

copy_rule_file() {
    local src_file="$1"
    local dest_dir="$2"
    local file_name=$(basename "$src_file")
    
    # 过滤非 markdown 文件
    if [[ ! "$file_name" =~ \.md$ ]]; then
        return
    fi
    
    # 执行复制
    cp "$src_file" "$dest_dir/"
    printf '%s\n' "$file_name" >> "$NEW_MANIFEST_FILE"
    echo -e "  ${GREEN}✓${NC} 已同步规则: $file_name"
    SYNC_COUNT=$((SYNC_COUNT + 1))
}

# 5. 执行同步逻辑
echo -e "${YELLOW}🔄 正在清理并更新托管规则文件...${NC}"

rm -f "$NEW_MANIFEST_FILE"
touch "$NEW_MANIFEST_FILE"

if [ -f "$MANIFEST_FILE" ]; then
    while IFS= read -r managed_file; do
        if [[ -n "$managed_file" && "$managed_file" != */* && "$managed_file" == *.md ]]; then
            rm -f "$TARGET_RULES_DIR/$managed_file"
        fi
    done < "$MANIFEST_FILE"
fi

if [ "$IS_MONO_REPO_RULES" = true ]; then
    # 模式 1：单仓库闭环，直接同步 .trae/rules 下的所有规则
    for file in "$SOURCE_DIR/.trae/rules"/*.md; do
        [ -e "$file" ] || continue
        copy_rule_file "$file" "$TARGET_RULES_DIR"
    done

elif [ "$IS_STRUCTURED_RULES" = true ]; then
    # 模式 2：分类规则同步

    # A. 无论什么项目，必须强制同步底线基础规则 (base/)
    if [ -d "$SOURCE_DIR/base" ]; then
        echo -e "${BLUE}👉 注入团队强制底线规则 (base)...${NC}"
        for file in "$SOURCE_DIR/base"/*.md; do
            [ -e "$file" ] || continue
            copy_rule_file "$file" "$TARGET_RULES_DIR"
        done
    fi

    # B. 智能探测开发项目技术栈并加载可选规则
    # 探测前端技术栈
    if [[ -f "$DEST_DIR/package.json" || -f "$DEST_DIR/yarn.lock" || -f "$DEST_DIR/pnpm-lock.yaml" ]]; then
        if [ -d "$SOURCE_DIR/frontend" ]; then
            echo -e "${BLUE}👉 探测到前端工程体系，注入前端专属规则 (frontend)...${NC}"
            for file in "$SOURCE_DIR/frontend"/*.md; do
                [ -e "$file" ] || continue
                copy_rule_file "$file" "$TARGET_RULES_DIR"
            done
        fi
    fi

    # 探测 Java 后端技术栈
    if [[ -f "$DEST_DIR/pom.xml" || -f "$DEST_DIR/build.gradle" || -f "$DEST_DIR/build.gradle.kts" ]]; then
        if [ -d "$SOURCE_DIR/backend" ]; then
            echo -e "${BLUE}👉 探测到 Java 后端工程体系，注入后端专属规则 (backend)...${NC}"
            for file in "$SOURCE_DIR/backend"/*.md; do
                [ -e "$file" ] || continue
                copy_rule_file "$file" "$TARGET_RULES_DIR"
            done
        fi
    fi

    # 探测 DevOps / 平台工程技术栈
    if [[ -f "$DEST_DIR/Dockerfile" || -f "$DEST_DIR/docker-compose.yml" || -f "$DEST_DIR/docker-compose.yaml" || -f "$DEST_DIR/compose.yml" || -f "$DEST_DIR/compose.yaml" || -f "$DEST_DIR/Jenkinsfile" || -d "$DEST_DIR/.github/workflows" || -d "$DEST_DIR/k8s" || -d "$DEST_DIR/kubernetes" || -d "$DEST_DIR/helm" ]] || find "$DEST_DIR" -maxdepth 2 -name "*.tf" -type f -print -quit | grep -q .; then
        if [ -d "$SOURCE_DIR/devops" ]; then
            echo -e "${BLUE}👉 探测到 DevOps/平台工程体系，注入运维专属规则 (devops)...${NC}"
            for file in "$SOURCE_DIR/devops"/*.md; do
                [ -e "$file" ] || continue
                copy_rule_file "$file" "$TARGET_RULES_DIR"
            done
        fi
    fi

else
    # 模式 3：直接扁平化平铺同步所有根目录的 markdown 文件
    for file in "$SOURCE_DIR"/*.md; do
        [ -e "$file" ] || continue
        # 排除同步脚本和 README 本身
        if [[ "$(basename "$file")" != "README.md" ]]; then
            copy_rule_file "$file" "$TARGET_RULES_DIR"
        fi
    done
fi

mv "$NEW_MANIFEST_FILE" "$MANIFEST_FILE"

# 6. 同步结果统计与反馈
echo -e "${BLUE}====================================================${NC}"
if [ "$SYNC_COUNT" -gt 0 ]; then
    echo -e "${GREEN}🎉 同步完成！共成功激活 $SYNC_COUNT 个 AI 技能规则。${NC}"
    echo -e "${GREEN}👉 提示: 请在 Trae AI 侧栏中确认规则生效情况。${NC}"
else
    echo -e "${YELLOW}⚠️ 同步结束，但未发现有效的规则文件（*.md）。${NC}"
fi
echo -e "${BLUE}====================================================${NC}"
