/**
 * ============================================================
 * Memory Type Definitions (메모리 타입 정의)
 * 
 * Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다.
 * ① Short-Term  ② Long-Term  ③ Project  ④ Procedural  ⑤ Episodic
 * ============================================================
 */

// ─── Common ───

export type MemoryLayer = 'short-term' | 'long-term' | 'project' | 'procedural' | 'episodic';

export interface MemoryContextResult {
    layer: MemoryLayer;
    label: string;
    content: string;
    relevance: number;  // 0.0 ~ 1.0
}

// ─── ① Short-Term Memory ───

export interface ShortTermMessage {
    role: 'user' | 'assistant' | 'system';
    content: string;
    timestamp: number;
}

// ─── ② Long-Term Memory ───

/**
 * Long-term category.
 * - 'episode-digest' 는 Distillation Loop 가 stale episodic memory 를 long-term 으로
 *   승급시킬 때 사용. 사용자가 직접 만드는 'decision' / 'rule' 등과 시각적으로 구분.
 */
export type LongTermCategory = 'preference' | 'rule' | 'decision' | 'goal' | 'episode-digest';

export interface LongTermEntry {
    id: string;
    category: LongTermCategory;
    content: string;
    source: string;              // 어떤 대화/세션에서 추출됐는지
    confidence: number;          // 0.0~1.0
    createdAt: number;
    lastReferencedAt: number;
    referenceCount: number;
    /**
     * Temporal marker — 이 사실이 *유효한 마지막 시점* (epoch ms).
     * 검색·context build 단계에서 expiresAt < now 인 entry 는 자동 제외.
     * undefined 면 영구 유효 (legacy 동작).
     *
     * 사용 예: "Q3 2026 마케팅 계획은 9월 30일까지만 유효" → expiresAt = 2026-09-30 epoch.
     */
    expiresAt?: number;
}

export interface LongTermStore {
    version: number;
    entries: LongTermEntry[];
    lastUpdated: number;
}

// ─── ③ Project Memory ───

export interface ArchitectureDecision {
    id: string;
    title: string;
    decision: string;
    rationale: string;
    alternatives: string[];
    date: number;
}

export interface BugRecord {
    id: string;
    description: string;
    rootCause: string;
    fix: string;
    date: number;
    relatedFiles: string[];
}

export interface ProjectMemoryStore {
    version: number;
    projectId: string;          // workspace 경로 기반 hash
    projectName: string;
    techStack: string[];
    architectureDecisions: ArchitectureDecision[];
    bugRecords: BugRecord[];
    requirements: string[];
    designDirection: string;
    codeConventions: string[];
    lastUpdated: number;
}

// ─── ④ Procedural Memory ───

export interface ProceduralEntry {
    id: string;
    name: string;                   // "P-Reinforce Wikification"
    triggerPatterns: string[];       // ["wiki화", "위키", "wikify"]
    steps: string[];                // 순서대로 실행할 절차
    filePath: string;               // 실제 MD 파일 경로
    lastUsed: number;
    useCount: number;
}

// ─── ⑤ Episodic Memory ───

export interface EpisodicEntry {
    id: string;
    sessionId: string;
    title: string;                  // 자동 생성된 에피소드 제목
    summary: string;                // 대화 요약
    keyDecisions: string[];         // 주요 결정사항
    topics: string[];               // 주요 토픽 키워드
    projectContext?: string;        // 연관 프로젝트 경로
    timestamp: number;
    duration: number;               // 세션 길이 (ms)
    messageCount: number;
    /**
     * Temporal marker — 에피소드의 *유효 마지막 시점* (epoch ms). 검색에서 자동 제외.
     * undefined 면 영구 (Distillation 이 archive 할 때까지).
     */
    expiresAt?: number;
    /**
     * Distillation Loop 가 이 episode 를 LongTerm digest 로 promote 했음을 표시.
     * promoted=true 면 검색·context build 에서 제외 (LongTerm 에 digest 가 있으니).
     */
    promoted?: boolean;
    /** promoted 인 경우 — 생성된 LongTerm digest entry id (역참조용). */
    promotedToLongTermId?: string;
}

export interface EpisodicStore {
    version: number;
    episodes: EpisodicEntry[];
    lastUpdated: number;
}

// ─── Memory Manager Config ───

export interface MemoryConfig {
    enabled: boolean;
    shortTermLimit: number;
    longTermMaxEntries: number;
    episodicMaxEpisodes: number;
    projectMemoryEnabled: boolean;
    proceduralMemoryEnabled: boolean;
    episodicMemoryEnabled: boolean;
}
