import { debug } from "./core/logger.js";
/**
 * 获取完整的团队态势信息，包括活动流、成员工作负载、过期分支和知识更新。
 * @param input - 团队态势感知输入参数
 * @returns 团队状态结果，包含活动流、成员工作量、过期分支、知识更新和中文摘要
 */
export async function getTeamStatus(input) {
    debug("team_awareness", "getTeamStatus() 开始执行");
    const { projectPath, gitOps, knowledgeIndex } = input;
    const since = input.since ?? defaultSince();
    const result = {
        activity_feed: [],
        member_workloads: [],
        recent_knowledge: [],
        stale_branches: [],
        summary: "",
    };
    // 1. 获取活动流（近 50 条提交记录）
    try {
        const log = await gitOps.getLog(projectPath, { since, maxCount: 50 });
        result.activity_feed = log.map((entry) => ({
            author: entry.author,
            date: entry.date,
            message: entry.message,
            short_hash: entry.shortHash,
            files_changed: 0, // 单从日志无法获取变更文件数
        }));
    }
    catch (e) {
        debug("team_awareness", "读取团队活动流失败", e);
    }
    // 2. 按成员统计工作负载（提交数、活跃文件、最后活跃时间）
    try {
        const shortlog = await gitOps.getShortlog(projectPath, since);
        for (const { author, count } of shortlog) {
            try {
                const authorLog = await gitOps.getLog(projectPath, { author, since, maxCount: 20 });
                const activeFiles = extractFilesFromMessages(authorLog.map((e) => e.message));
                result.member_workloads.push({
                    author,
                    commit_count: count,
                    active_files: activeFiles,
                    last_active: authorLog.length > 0 ? authorLog[0].date : "",
                });
            }
            catch (e) {
                debug("team_awareness", "读取成员提交记录失败", e);
            }
        }
    }
    catch (e) {
        debug("team_awareness", "读取成员工作负载失败", e);
    }
    // 3. 检测过期分支（超过 30 天无新提交的分支）
    // 待办: getLog 没有 branch/ref 参数，无法按分支查询日志
    // path 过滤会将 branch.name 当作文件路径处理，结果不准确
    // 正确修复需在 GitOperations.getLog 中添加 `ref` 选项
    // 或直接使用 `git log <branch> -1 --format=%aI` 命令
    try {
        const branches = await gitOps.listBranches(projectPath);
        for (const branch of branches) {
            if (branch.isCurrent)
                continue; // 跳过当前分支
            try {
                const branchLog = await gitOps.getLog(projectPath, { maxCount: 1, path: branch.name });
                if (branchLog.length > 0) {
                    const lastDate = new Date(branchLog[0].date);
                    const daysSince = (Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24);
                    // 分支超过 30 天无新提交视为过期
                    if (daysSince > 30) {
                        result.stale_branches.push({
                            name: branch.name,
                            last_commit_date: branchLog[0].date,
                        });
                    }
                }
            }
            catch (e) {
                debug("team_awareness", "读取分支日志失败", e);
            }
        }
    }
    catch (e) {
        debug("team_awareness", "检测过期分支失败", e);
    }
    // 4. 获取近期知识条目更新（需提供知识索引）
    if (knowledgeIndex) {
        try {
            const allEntries = knowledgeIndex.getAllEntries();
            const sinceDate = new Date(since);
            // 合并全局和项目级知识条目，筛选在时间范围内且有 active 状态的条目
            const combined = [...allEntries.global, ...allEntries.project];
            result.recent_knowledge = combined
                .filter((e) => e.status === "active" && new Date(e.updated_at) >= sinceDate)
                .map((e) => ({ name: e.name, type: e.type, updated: e.updated_at }));
        }
        catch (e) {
            debug("team_awareness", "读取近期知识更新失败", e);
        }
    }
    // 5. 生成中文摘要
    const parts = [];
    if (result.member_workloads.length > 0) {
        parts.push(`${result.member_workloads.length} 名活跃成员`);
    }
    if (result.stale_branches.length > 0) {
        parts.push(`${result.stale_branches.length} 个过期分支`);
    }
    if (result.recent_knowledge.length > 0) {
        parts.push(`${result.recent_knowledge.length} 条知识更新`);
    }
    result.summary = parts.length > 0 ? parts.join("，") : "暂无团队活动";
    return result;
}
/**
 * 计算默认的起始日期：当前时间往前推 7 天。
 * @returns YYYY-MM-DD 格式的日期字符串
 */
function defaultSince() {
    const d = new Date();
    d.setDate(d.getDate() - 7);
    return d.toISOString().split("T")[0];
}
/**
 * 从提交消息中提取文件路径。使用正则匹配常见编程语言的文件扩展名。
 * @param messages - 提交消息列表
 * @returns 提取到的去重文件路径列表（最多 10 个）
 */
function extractFilesFromMessages(messages) {
    const files = new Set();
    for (const msg of messages) {
        // 匹配常见源码文件扩展名
        const matches = msg.matchAll(/[\w/.-]+\.(java|ts|tsx|js|jsx|py|go|rs)/g);
        for (const m of matches) {
            files.add(m[0]);
        }
    }
    // 限制返回数量，避免列表过长
    return [...files].slice(0, 10);
}
//# sourceMappingURL=team_awareness.js.map