import fs from "node:fs/promises";
import fss from "node:fs";
import path from "node:path";
import matter from "gray-matter";
import YAML from "yaml";
import { debug } from "../engine/core/logger.js";
/**
 * 检查知识条目的健康状态。
 * @description 遍历所有知识条目，检测两类健康问题：
 *              1. 90 天未使用的活跃条目自动标记为 pending_review
 *              2. 创建 7 天后仍零使用的活跃条目自动标记为 pending_review
 *              直接修改条目的 status 字段并返回问题列表。
 * @param entries - 待检查的知识条目列表
 * @returns 包含健康问题信息的数组，每项包含问题条目和问题类型（stale_90d 或 zero_usage）
 */
export function checkKnowledgeHealth(entries) {
    const issues = [];
    const now = Date.now();
    const ninetyDays = 90 * 24 * 60 * 60 * 1000;
    for (const entry of entries) {
        // 统一使用 knowledge_lifecycle_status 字段（与 lifecycle.ts 一致），fallback 到 status
        const raw = entry;
        const lifecycleStatus = raw.knowledge_lifecycle_status
            ? String(raw.knowledge_lifecycle_status)
            : entry.status;
        const setStatus = (newStatus) => {
            entry.status = newStatus;
            if ("knowledge_lifecycle_status" in entry) {
                raw.knowledge_lifecycle_status = newStatus;
            }
        };
        // 90 天未更新 → 自动标记为 pending_review（统一使用 updated_at，去掉 last_used_at 分支）
        const lastUsed = new Date(entry.updated_at).getTime();
        if (now - lastUsed > ninetyDays && lifecycleStatus === "active") {
            setStatus("pending_review");
            issues.push({ entry, issue: "stale_90d" });
        }
        // 创建 7 天后仍零使用 → 自动标记为 pending_review
        if (entry.usage_count === 0 && lifecycleStatus === "active") {
            const age = now - new Date(entry.created_at).getTime();
            if (age > 7 * 24 * 60 * 60 * 1000) {
                setStatus("pending_review");
                issues.push({ entry, issue: "zero_usage" });
            }
        }
    }
    if (issues.length > 0) {
        debug("健康检查", `发现 ${issues.length} 个健康问题。`);
    }
    return issues;
}
/**
 * 将健康检查导致的状态变更持久化到磁盘。
 * @description 遍历所有健康检查发现的问题条目，将其 status 和 updated_at 写回对应的文件。
 *              支持 Markdown（frontmatter）和 YAML 两种格式。使用原子写入（先写 .tmp 再 rename）。
 *              单文件写入失败不影响其他文件的处理。
 * @param issues - 健康检查返回的问题列表
 */
export async function persistHealthChanges(issues) {
    if (issues.length === 0)
        return;
    debug("健康检查", `持久化 ${issues.length} 条状态变更...`);
    for (const { entry } of issues) {
        if (!entry.file_path || !fss.existsSync(entry.file_path))
            continue;
        try {
            const ext = path.extname(entry.file_path);
            if (ext === ".md") {
                const raw = await fs.readFile(entry.file_path, "utf-8");
                const { data, content } = matter(raw);
                data.status = entry.status;
                data.updated_at = new Date().toISOString().split("T")[0];
                const tmpPath = `${entry.file_path}.tmp`;
                await fs.writeFile(tmpPath, matter.stringify(content, data), "utf-8");
                await fs.rename(tmpPath, entry.file_path);
            }
            else if (ext === ".yaml" || ext === ".yml") {
                const raw = await fs.readFile(entry.file_path, "utf-8");
                const data = YAML.parse(raw);
                data.status = entry.status;
                data.updated_at = new Date().toISOString().split("T")[0];
                const tmpPath = `${entry.file_path}.tmp`;
                await fs.writeFile(tmpPath, YAML.stringify(data), "utf-8");
                await fs.rename(tmpPath, entry.file_path);
            }
        }
        catch {
            // 单文件写入失败不影响其他文件
            debug("健康检查", `写入文件失败 — ${entry.file_path}`);
        }
    }
    debug("健康检查", "状态变更持久化完成。");
}
//# sourceMappingURL=health_checker.js.map