package com.cirle.scientific.questionnaire.cache;

import com.cirle.scientific.questionnaire.entity.QuestionnaireEntity;
import com.cirle.scientific.questionnaire.exception.QuestionnaireNotFoundException;
import lombok.extern.slf4j.Slf4j;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * 简单的问卷内存缓存
 */
@Slf4j
public class SimpleQuestionnaireCache {

    // ID索引
    private static final Map<String, QuestionnaireEntity> ID_INDEX = new HashMap<>();

    /**
     * 该类不允许被实例化
     */
    private SimpleQuestionnaireCache() {
    }

    /**
     * 初始化问卷缓存
     *
     * @param questionnaires 问卷实体对象集
     */
    public static synchronized void init(Collection<QuestionnaireEntity> questionnaires) {
        ID_INDEX.clear();
        questionnaires.forEach(SimpleQuestionnaireCache::append);
        log.info("问卷缓存初始化完成");
    }

    /**
     * 追加问卷实体到缓存中
     *
     * @param questionnaire 问卷实体对象
     */
    public static synchronized void append(QuestionnaireEntity questionnaire) {
        ID_INDEX.put(questionnaire.getId(), questionnaire);
    }

    /**
     * 根据ID查询问卷实体对象
     *
     * @param id 问卷ID
     * @return 问卷实体对象
     */
    public static Optional<QuestionnaireEntity> queryById(String id) {
        QuestionnaireEntity questionnaire = ID_INDEX.get(id);
        return questionnaire != null ? Optional.of(questionnaire) : Optional.empty();
    }

    /**
     * 根据ID获取问卷实体对象
     *
     * @param id 问卷ID
     * @return 问卷实体对象
     */
    public static QuestionnaireEntity getById(String id) throws QuestionnaireNotFoundException {
        QuestionnaireEntity questionnaire = ID_INDEX.get(id);
        if (questionnaire == null) {
            throw new QuestionnaireNotFoundException();
        }
        return questionnaire;
    }

}
