import { debug } from "../core/logger.js";
/**
 * 技术债务报告生成模块 — 基于债务追踪器数据，生成聚合统计报告。
 * 包括按类别/严重程度分组、最久未解决天数、趋势分析和优先级排序。
 */
/** 严重程度权重映射，用于优先级评分 */
const SEVERITY_SCORE = {
    critical: 4,
    warning: 3,
    info: 1,
};
/** 影响程度权重映射，用于优先级评分 */
const IMPACT_SCORE = {
    high: 3,
    medium: 2,
    low: 1,
};
/**
 * 计算两个 ISO 日期字符串之间的天数差。
 * @param a - 起始日期字符串（ISO 格式）
 * @param b - 结束日期字符串（ISO 格式）
 * @returns 间隔天数，最小值为 0
 */
function daysBetween(a, b) {
    const msPerDay = 86400_000;
    // 向下取整并确保不返回负值
    return Math.max(0, Math.floor((Date.parse(b) - Date.parse(a)) / msPerDay));
}
/**
 * 计算单条债务的优先级评分。分数 = 严重程度权重 x 影响程度权重。
 * @param item - 债务条目
 * @returns 优先级评分（1~12，越高越紧急）
 */
function computePriorityScore(item) {
    const sev = SEVERITY_SCORE[item.severity] ?? 1;
    const imp = IMPACT_SCORE[item.impact ?? "medium"];
    return sev * imp;
}
/**
 * 生成完整的技术债务报告，包含分组统计、趋势数据和优先级排序。
 * @param tracker - 技术债务追踪器实例
 * @returns 债务报告，包含总数、分类统计、严重程度分布、最久未解决天数、趋势和中文摘要
 */
export async function generateDebtReport(tracker) {
    debug("技术债务", "开始生成技术债务报告");
    const openItems = await tracker.listOpen();
    // 未解决的债务总数
    const total_open = openItems.length;
    // 按类别分组统计
    const by_category = {};
    for (const item of openItems) {
        const cat = item.category ?? "other";
        by_category[cat] = (by_category[cat] ?? 0) + 1;
    }
    // 按严重程度分组统计
    const by_severity = {};
    for (const item of openItems) {
        by_severity[item.severity] = (by_severity[item.severity] ?? 0) + 1;
    }
    // 计算最久未解决的债务天数
    let oldest_debt_days = 0;
    const now = new Date().toISOString();
    for (const item of openItems) {
        const days = daysBetween(item.discovered_at, now);
        if (days > oldest_debt_days)
            oldest_debt_days = days;
    }
    // 获取近 30 天的债务增减趋势
    const trend_30d = await tracker.getTrend(30);
    // 按优先级评分降序排列，取前 5 条作为最高优先级条目
    // 最高优先级条目（按 严重程度 x 影响程度 降序排列，取前 5 条）
    const sorted = [...openItems].sort((a, b) => computePriorityScore(b) - computePriorityScore(a));
    const top_priority = sorted.slice(0, 5);
    // 生成中文摘要
    const criticalCount = by_severity["critical"] ?? 0;
    const warningCount = by_severity["warning"] ?? 0;
    const infoCount = by_severity["info"] ?? 0;
    const parts = [];
    parts.push(`共 ${total_open} 条未解决技术债务`);
    parts.push(`${criticalCount} critical, ${warningCount} warning, ${infoCount} info`);
    parts.push(`最久未解决: ${oldest_debt_days} 天`);
    const summary = parts.join("；") + "。";
    debug("技术债务", `生成完成 — ${summary}`);
    return {
        total_open,
        by_category,
        by_severity,
        oldest_debt_days,
        trend_30d,
        top_priority,
        summary,
    };
}
//# sourceMappingURL=debt_reporter.js.map