package com.ym.mec.biz.service.impl;

import com.ym.mec.auth.api.client.SysUserFeignService;
import com.ym.mec.auth.api.entity.SysUser;
import com.ym.mec.biz.dal.dao.QuestionnaireQuestionDao;
import com.ym.mec.biz.dal.dao.QuestionnaireQuestionItemDao;
import com.ym.mec.biz.dal.dao.QuestionnaireUserResultDao;
import com.ym.mec.biz.dal.entity.*;
import com.ym.mec.common.dal.BaseDAO;
import com.ym.mec.common.exception.BizException;
import org.springframework.beans.factory.annotation.Autowired;
import com.ym.mec.common.service.impl.BaseServiceImpl;
import com.ym.mec.biz.service.QuestionnaireTopicService;
import com.ym.mec.biz.dal.dao.QuestionnaireTopicDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class QuestionnaireTopicServiceImpl extends BaseServiceImpl<Integer, QuestionnaireTopic>  implements QuestionnaireTopicService {
	
	@Autowired
	private QuestionnaireTopicDao questionnaireTopicDao;
	@Autowired
	private QuestionnaireQuestionDao questionnaireQuestionDao;
	@Autowired
	private QuestionnaireQuestionItemDao questionnaireQuestionItemDao;
	@Autowired
	private QuestionnaireUserResultDao questionnaireUserResultDao;
	@Autowired
	private SysUserFeignService sysUserFeignService;

	@Override
	public BaseDAO<Integer, QuestionnaireTopic> getDAO() {
		return questionnaireTopicDao;
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void add(QuestionnaireTopic questionnaireTopic) {
		SysUser sysUser = sysUserFeignService.queryUserInfo();
		questionnaireTopic.setCreatorId(sysUser.getId());
		questionnaireTopicDao.insert(questionnaireTopic);
		Integer topicId = questionnaireTopic.getId();
		List<QuestionnaireQuestion> questionnaireQuestionList = questionnaireTopic.getQuestionnaireQuestionList();
		if(questionnaireQuestionList != null && questionnaireQuestionList.size() > 0){
			for (QuestionnaireQuestion questionnaireQuestion : questionnaireQuestionList) {
				questionnaireQuestion.setQuestionnaireTopicId(topicId);
				questionnaireQuestionDao.insert(questionnaireQuestion);
				Long questionId = questionnaireQuestion.getId();
				List<QuestionnaireQuestionItem> questionItemList = questionnaireQuestion.getQuestionnaireQuestionItemList();
				if(questionItemList != null && questionItemList.size() > 0){
					questionnaireQuestionItemDao.batchInsert(questionItemList,questionId,topicId);
				}
			}
		}
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void modify(QuestionnaireTopic questionnaireTopic) {
		Date date = new Date();
		questionnaireTopic.setUpdateTime(date);
		questionnaireTopicDao.update(questionnaireTopic);
		Integer topicId = questionnaireTopic.getId();
		List<Long> delQuestionnaireQuestionIdList = questionnaireTopic.getDelQuestionnaireQuestionIdList();
		//调查问卷是否有用户参与
		int num = questionnaireUserResultDao.countByTopicId(topicId);
		if(num > 0){
			throw new BizException("操作失败：该调查问卷已使用");
		}
		if(delQuestionnaireQuestionIdList != null && delQuestionnaireQuestionIdList.size() > 0){
			questionnaireQuestionDao.batchDel(delQuestionnaireQuestionIdList);
			questionnaireQuestionItemDao.batchDelByQuestionIdList(delQuestionnaireQuestionIdList);
		}
		List<QuestionnaireQuestion> questionnaireQuestionList = questionnaireTopic.getQuestionnaireQuestionList();
		if(questionnaireQuestionList != null && questionnaireQuestionList.size() > 0){
			//获取需要修改的问题
			List<QuestionnaireQuestion> updateCollect = questionnaireQuestionList.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
			if(updateCollect != null && updateCollect.size() > 0){
				for (QuestionnaireQuestion question : updateCollect) {
					//需要删除的问题答案
					List<Long> delQuestionnaireQuestionItemIdList = question.getDelQuestionnaireQuestionItemIdList();
					if(delQuestionnaireQuestionItemIdList != null && delQuestionnaireQuestionItemIdList.size() > 0){
						questionnaireQuestionItemDao.batchDel(delQuestionnaireQuestionItemIdList);
					}
					questionnaireQuestionDao.update(question);
					Long questionId = question.getId();
					List<QuestionnaireQuestionItem> questionItemList = question.getQuestionnaireQuestionItemList();
					if(questionItemList != null && questionItemList.size() > 0){
						//获取需要修改的答案
						List<QuestionnaireQuestionItem> updateItemList = questionItemList.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
						if(updateItemList != null && updateItemList.size() > 0){
							questionnaireQuestionItemDao.batchUpdate(updateItemList);
						}
						//获取删除的答案
						List<QuestionnaireQuestionItem> insertItemList = questionItemList.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
						if(insertItemList != null && insertItemList.size() > 0){
							questionnaireQuestionItemDao.batchInsert(insertItemList,questionId,topicId);
						}
					}
				}
			}
			//获取需要新增的问题
			List<QuestionnaireQuestion> addCollect = questionnaireQuestionList.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
			if(addCollect.size() > 0){
				for (QuestionnaireQuestion question : addCollect) {
					question.setQuestionnaireTopicId(topicId);
					questionnaireQuestionDao.insert(question);
					Long questionId = question.getId();
					List<QuestionnaireQuestionItem> questionItemList = question.getQuestionnaireQuestionItemList();
					if(questionItemList != null && questionItemList.size() > 0){
						questionnaireQuestionItemDao.batchInsert(questionItemList,questionId,topicId);
					}
				}
			}
		}
	}

	@Override
	public QuestionnaireTopic getDetail(Integer topicId) {
		QuestionnaireTopic questionnaireTopic = questionnaireTopicDao.get(topicId);
		Map<String,Object> paramMap = new HashMap(1);
		paramMap.put("topicId",topicId);
		questionnaireTopic.setQuestionnaireQuestionList(questionnaireQuestionDao.findAll(paramMap));
		return questionnaireTopic;
	}
}