/**
 * master-loader.ts
 *
 * legal-duty-master.json 단일 진실 공급원(SSoT) 로더.
 * src/build 두 위치를 자동 탐색하여 캐싱.
 */
import { readFileSync } from "node:fs";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
// Issue #5 lateral (2026-05-22) — KST 기준 일자 산술
import { parseKstDate, formatKstDate } from "./datetime-kst.js";
const __dirname = dirname(fileURLToPath(import.meta.url));
let cache = null;
export function loadMaster() {
    if (cache)
        return cache;
    const candidates = [
        resolve(__dirname, "../ontology/legal-duty-master.json"),
        resolve(__dirname, "../../src/ontology/legal-duty-master.json"),
    ];
    for (const p of candidates) {
        try {
            const raw = readFileSync(p, "utf8");
            cache = JSON.parse(raw);
            return cache;
        }
        catch {
            // try next
        }
    }
    throw new Error("legal-duty-master.json not found");
}
export function findDoc(docId) {
    return loadMaster().documents.find((d) => d.docId === docId);
}
// retention 문자열 → 일수 환산 (대략)
export function retentionToDays(retention) {
    if (!retention)
        return null;
    const m = retention.match(/(\d+)\s*년/);
    if (m)
        return Number(m[1]) * 365;
    if (retention.includes("영구"))
        return Number.POSITIVE_INFINITY;
    if (retention.includes("공사 완료"))
        return 0; // 공사 완료 시점 기준
    if (retention.includes("현장 운영"))
        return 0;
    if (retention.includes("기계 사용"))
        return 0;
    return null;
}
// nextDueRule + compileDate → 다음 작성일 (KST 기준 YYYY-MM-DD)
// Issue #5 lateral — UTC 자정 파싱 + UTC substring 회귀 해소.
export function computeNextDueDate(rule, compileDate) {
    if (!rule)
        return null;
    const m = rule.match(/compileDate\s*\+\s*P(\d+)([DMY])/);
    if (!m)
        return null;
    const n = Number(m[1]);
    const unit = m[2];
    const d = parseKstDate(compileDate);
    if (Number.isNaN(d.getTime()))
        return null;
    // KST 자정 기준에서 D/M/Y 산술 — setDate/setMonth/setFullYear 는 timezone 무관 정수 가산
    if (unit === "D")
        d.setUTCDate(d.getUTCDate() + n);
    else if (unit === "M")
        d.setUTCMonth(d.getUTCMonth() + n);
    else if (unit === "Y")
        d.setUTCFullYear(d.getUTCFullYear() + n);
    return formatKstDate(d);
}
//# sourceMappingURL=master-loader.js.map