/**
 * Organizational Memory — 조직 규칙·프로세스·선호 방식 시스템 프롬프트 블록.
 *
 * Self-Evolving OS 마스터 플랜 Phase 5 / Track 5-2 (설계서 11장 Organizational
 * Memory). "이 회사는 속도 우선, 완벽주의 지양" 류의 조직 문화·업무 방식을
 * 모든 업무 turn 에 주입한다.
 *
 * Terminology Dictionary 와 같은 "파일이 UI" 패턴 — 사용자가
 * <brain>/.astra/organization.md 를 직접 편집하면 다음 turn 부터 반영.
 * 파일이 없으면 no-op. (User Memory 는 기존 LongTermMemory 가 담당 — 이 블록은
 * 검색 score 와 무관하게 *항상* 주입되어야 하는 불변 조직 규칙용.)
 *
 * 권장 파일 구조 (자유 형식 markdown):
 *   ## 업무 방식  / ## 보고 형식  / ## 의사결정 원칙  / ## 금지 사항
 */

import * as fs from 'fs';
import * as path from 'path';

export const ORG_MEMORY_REL_PATH = path.join('.astra', 'organization.md');

export interface OrgMemoryBlockOptions {
    /** 본문 최대 길이 (chars) — 시스템 프롬프트 비대 방지. 기본 3000. */
    maxBodyLength: number;
}

export const DEFAULT_ORG_MEMORY_OPTIONS: OrgMemoryBlockOptions = {
    maxBodyLength: 3000,
};

/**
 * 블록 생성 — brainPath 의 organization.md 를 읽어 주입. 파일 없음/읽기 실패 → ''.
 * mtime 캐시 없이 매 turn 직접 읽음 (파일이 작고, 편집 즉시 반영이 더 중요).
 */
export function buildOrgMemoryBlock(brainPath: string, options: Partial<OrgMemoryBlockOptions> = {}): string {
    const opts: OrgMemoryBlockOptions = { ...DEFAULT_ORG_MEMORY_OPTIONS, ...options };
    let raw = '';
    try {
        const file = path.join(brainPath, ORG_MEMORY_REL_PATH);
        if (!fs.existsSync(file)) return '';
        raw = fs.readFileSync(file, 'utf8').trim();
    } catch {
        return '';
    }
    if (!raw) return '';

    let body = raw;
    let truncated = false;
    if (body.length > opts.maxBodyLength) {
        body = body.slice(0, opts.maxBodyLength);
        truncated = true;
    }

    const lines: string[] = [];
    lines.push('[ORGANIZATIONAL MEMORY]');
    lines.push('아래는 이 조직의 업무 방식·규칙·선호다. 업무 산출물(회의록/조사/일정)은 이 방식을 *항상* 따를 것.');
    lines.push('사용자 명시 지시와 충돌하면 사용자 지시 우선 (Human Override).');
    lines.push('');
    lines.push('---');
    lines.push(body);
    if (truncated) {
        lines.push('');
        lines.push(`_…(${raw.length - opts.maxBodyLength}자 잘림 — 핵심 규칙을 앞쪽에 배치해 주세요)_`);
    }
    lines.push('---');
    lines.push('[/ORGANIZATIONAL MEMORY]');
    return lines.join('\n');
}
