package com.cirle.scientific.questionnaire.service;

import com.cirle.scientific.questionnaire.cache.SimpleQuestionnaireCache;
import com.cirle.scientific.questionnaire.entity.QuestionnaireEntity;
import com.cirle.scientific.questionnaire.exception.QuestionnaireNotFoundException;
import com.cirle.scientific.questionnaire.repository.QuestionnaireRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class QuestionnaireService {

    @Autowired
    private QuestionnaireRepository questionnaireRepository;

    /**
     * 查询问卷列表
     *
     * @return 问卷实体对象列表
     */
    public List<QuestionnaireEntity> queryQuestionnaires() {
        List<QuestionnaireEntity> questionnaireEntities = new ArrayList<>();
        Iterable<QuestionnaireEntity> maybeQuestionnaires = questionnaireRepository.findAll();
        maybeQuestionnaires.forEach(questionnaireEntities::add);
        return questionnaireEntities;
    }

    /**
     * 获取问卷
     *
     * @param id 问卷ID
     * @return 问卷实体对象
     * @throws QuestionnaireNotFoundException 当指定ID的问卷实体不存在时抛出该异常
     */
    public QuestionnaireEntity getQuestionnaire(@NotNull String id) throws QuestionnaireNotFoundException {
        Optional<QuestionnaireEntity> maybeQuestionnaire = queryQuestionnaire(id);
        if (maybeQuestionnaire.isPresent()) {
            return maybeQuestionnaire.get();
        }
        throw new QuestionnaireNotFoundException(String.format("不存在ID为%s的问卷实体", id));
    }

    /**
     * 获取问卷
     *
     * @param id 问卷ID
     * @return 可选的问卷实体对象
     */
    public Optional<QuestionnaireEntity> queryQuestionnaire(@NotNull String id) {
        // 优先从缓存中获取
        Optional<QuestionnaireEntity> maybeQuestionnaire = SimpleQuestionnaireCache.queryById(id);
        // 缓存命中则返回问卷实体
        if (maybeQuestionnaire.isPresent()) {
            return maybeQuestionnaire;
        }
        // 缓存未命中则尝试从数据库查询
        maybeQuestionnaire = questionnaireRepository.findById(id);
        // 若数据库中也不存在该问卷实体则返回Optional空内容
        if (!maybeQuestionnaire.isPresent()) {
            return Optional.empty();
        }
        // 若数据库中存在，则添加到缓存中再返回
        SimpleQuestionnaireCache.append(maybeQuestionnaire.get());
        return maybeQuestionnaire;
    }

}
