/**
 * 간격 반복 컨테이너
 * 의존성 주입 컨테이너
 */
import { SpacedRepetitionFactory } from '../../factories/spaced-repetition.factory.js';
/**
 * 간격 반복 컨테이너
 * 싱글톤 패턴으로 전역 상태 관리
 */
export class SpacedRepetitionContainer {
    static instance = null;
    service = null;
    config = null;
    constructor() { }
    /**
     * 싱글톤 인스턴스 반환
     */
    static getInstance() {
        if (!SpacedRepetitionContainer.instance) {
            SpacedRepetitionContainer.instance = new SpacedRepetitionContainer();
        }
        return SpacedRepetitionContainer.instance;
    }
    /**
     * 설정 초기화
     */
    initialize(config) {
        this.config = config;
        this.service = SpacedRepetitionFactory.createService(config);
    }
    /**
     * 기본 설정으로 초기화
     */
    initializeWithDefaults(weights) {
        const defaultConfig = {
            weights: {
                importance: 0.6,
                usage: 0.4,
                helpful_feedback: 0.5,
                bad_feedback: 0.7,
                ...weights
            },
            recallThreshold: 0.7,
            defaultInterval: 7
        };
        this.initialize(defaultConfig);
    }
    /**
     * 서비스 반환
     */
    getService() {
        if (!this.service) {
            throw new Error('SpacedRepetitionContainer가 초기화되지 않았습니다. initialize()를 먼저 호출하세요.');
        }
        return this.service;
    }
    /**
     * 설정 반환
     */
    getConfig() {
        if (!this.config) {
            throw new Error('SpacedRepetitionContainer가 초기화되지 않았습니다. initialize()를 먼저 호출하세요.');
        }
        return this.config;
    }
    /**
     * 초기화 여부 확인
     */
    isInitialized() {
        return this.service !== null && this.config !== null;
    }
    /**
     * 컨테이너 리셋
     */
    reset() {
        this.service = null;
        this.config = null;
    }
    /**
     * 설정 업데이트
     */
    updateConfig(newConfig) {
        if (!this.config) {
            throw new Error('컨테이너가 초기화되지 않았습니다.');
        }
        const updatedConfig = {
            ...this.config,
            ...newConfig
        };
        this.initialize(updatedConfig);
    }
    /**
     * 가중치 업데이트
     */
    updateWeights(newWeights) {
        if (!this.config) {
            throw new Error('컨테이너가 초기화되지 않았습니다.');
        }
        const updatedWeights = {
            ...this.config.weights,
            ...newWeights
        };
        this.updateConfig({ weights: updatedWeights });
    }
    /**
     * 임계값 업데이트
     */
    updateThreshold(newThreshold) {
        this.updateConfig({ recallThreshold: newThreshold });
    }
    /**
     * 기본 간격 업데이트
     */
    updateDefaultInterval(newInterval) {
        this.updateConfig({ defaultInterval: newInterval });
    }
}
/**
 * 전역 컨테이너 접근 함수들
 */
export function getSpacedRepetitionService() {
    return SpacedRepetitionContainer.getInstance().getService();
}
export function initializeSpacedRepetition(config) {
    SpacedRepetitionContainer.getInstance().initialize(config);
}
export function initializeSpacedRepetitionWithDefaults(weights) {
    SpacedRepetitionContainer.getInstance().initializeWithDefaults(weights);
}
export function isSpacedRepetitionInitialized() {
    return SpacedRepetitionContainer.getInstance().isInitialized();
}
export function resetSpacedRepetition() {
    SpacedRepetitionContainer.getInstance().reset();
}
//# sourceMappingURL=spaced-repetition-container.js.map