package cn.iocoder.byzs.module.web.service.questionnaire;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo.ConfigQuestionRespVO;
import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaireresult.vo.QuestionnaireResultSaveReqVO;
import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaireresultdetails.vo.QuestionnaireResultDetailsSaveReqVO;
import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestion.CourseQuestionDO;
import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestoption.CourseQuestOptionDO;
import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaire.QuestionnaireDO;
import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaireresult.QuestionnaireResultDO;
import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaireresultdetails.QuestionnaireResultDetailsDO;
import cn.iocoder.byzs.module.bjdx.dal.mysql.coursequestion.CourseQuestionMapper;
import cn.iocoder.byzs.module.bjdx.dal.mysql.coursequestoption.CourseQuestOptionMapper;
import cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaire.QuestionnaireMapper;
import cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaireresult.QuestionnaireResultMapper;
import cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaireresultdetails.QuestionnaireResultDetailsMapper;
import cn.iocoder.byzs.module.bjdx.service.questionnaire.QuestionnaireService;
import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireResultVo;
import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireShowVo;
import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireVo;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * web课程 Service 实现类
 *
 * @author lyb
 */
@Service
@Validated
public class WebQuestionnaireServiceImpl {

    @Resource
    private QuestionnaireService questionnaireService;
    @Resource
    private QuestionnaireMapper questionnaireMapper;
    @Resource
    private CourseQuestionMapper courseQuestionMapper;
    @Resource
    private CourseQuestOptionMapper courseQuestOptionMapper;
    @Resource
    private QuestionnaireResultMapper questionnaireResultMapper;
    @Resource
    private QuestionnaireResultDetailsMapper questionnaireResultDetailsMapper;

    public WebQuestionnaireShowVo getQuestionVoList(Long qrId, Long userId) {
        // 结果主表插入（关键修改：时间类型转换）
        LocalDateTime startTime = LocalDateTime.now(); // 直接使用 LocalDateTime
        QuestionnaireResultDO questionnaireResult = new QuestionnaireResultDO()
            .setBqrUserId(userId)
            .setBqrQuestionnaireId(qrId)
            .setBqrStartTime(startTime) // 改为 LocalDateTime 类型
            .setBqrStatus("1");
        questionnaireResultMapper.insert(questionnaireResult);
        // 问卷信息填充
        WebQuestionnaireShowVo webQuestionnaireShowVo = new WebQuestionnaireShowVo();
        webQuestionnaireShowVo.setQrResultId(questionnaireResult.getId());

        //问卷信息
        QuestionnaireDO questionnaire = questionnaireService.getQuestionnaire(qrId);
        WebQuestionnaireVo questionnaireVo = new WebQuestionnaireVo();
        questionnaireVo.setQrId(questionnaire.getId());
        questionnaireVo.setQrName(questionnaire.getBqQuestionnaire());
        questionnaireVo.setQrDetails(questionnaire.getBqDetails());
        questionnaireVo.setQrOrder(questionnaire.getBqOrder());
        questionnaireVo.setQrStartInfo(questionnaire.getBqStartInfo());
        questionnaireVo.setQrEndInfo(questionnaire.getBqEndInfo());
        questionnaireVo.setQrQuestIds(questionnaire.getBqQuestIds());

        // 问题列表处理
        List<ConfigQuestionRespVO> configQuestionRespVOList = questionnaireMapper.selectConfigQuestionList(new ConfigQuestionRespVO().setQuestionnaireId(qrId));
        if (CollUtil.isNotEmpty(configQuestionRespVOList)) {
            Set<Long> qustionIdSet = configQuestionRespVOList.stream().map(ConfigQuestionRespVO::getId).collect(Collectors.toSet());

            // 选项列表处理
            List<CourseQuestOptionDO> questOptionDOList = courseQuestOptionMapper.selectListByQuestId(qustionIdSet);
            if (CollUtil.isNotEmpty(questOptionDOList)) {
                Map<Long, List<CourseQuestOptionDO>> questionOptionMap = questOptionDOList.stream().collect(Collectors.groupingBy(CourseQuestOptionDO::getCqoQuestId));

                List<WebQuestionnaireVo.WebQuestion> questionList = new ArrayList<>();
                configQuestionRespVOList.forEach(configQuestionRespVO -> {
                    WebQuestionnaireVo.WebQuestion webQuestion = new WebQuestionnaireVo.WebQuestion();
                    webQuestion.setQId(configQuestionRespVO.getId())
                        .setQType(configQuestionRespVO.getCqQuestType())
                        .setQContent(configQuestionRespVO.getCqQuestion())
                        .setQAnalysis(configQuestionRespVO.getCqQuestAnalysis())
                        .setQOrder(configQuestionRespVO.getBqOrder());

                    List<CourseQuestOptionDO> questOptionDOMapList = questionOptionMap.get(webQuestion.getQId());
                    if (CollUtil.isNotEmpty(questOptionDOMapList)) {
                        List<WebQuestionnaireVo.WebQuestion.WebQuestOption> questOptionList = new ArrayList<>();
                        questOptionDOMapList.forEach(questOptionDO -> {
                            WebQuestionnaireVo.WebQuestion.WebQuestOption webQuestOption = new WebQuestionnaireVo.WebQuestion.WebQuestOption();
                            webQuestOption.setOId(questOptionDO.getId());
                            webQuestOption.setOValue(questOptionDO.getCqoValue());
                            webQuestOption.setOName(questOptionDO.getCqoOption());
                            webQuestOption.setOSorce(questOptionDO.getCqoSocre());
                            webQuestOption.setOIsAnswer(questOptionDO.getCqoIsAnswer());
                            questOptionList.add(webQuestOption);
                        });
                        // 新增：选项按 oValue 升序排序
                        questOptionList.sort(Comparator.comparing(WebQuestionnaireVo.WebQuestion.WebQuestOption::getOValue));
                        webQuestion.setQuestionOptionsList(questOptionList);
                    }
                    questionList.add(webQuestion);
                });
                // 新增：问题列表按 qOrder 升序排序（假设 qOrder 是整数类型）
                questionList.sort(Comparator.comparingInt(WebQuestionnaireVo.WebQuestion::getQOrder));
                questionnaireVo.setQuestionList(questionList);
            }
        }
        webQuestionnaireShowVo.setQuestionnaire(questionnaireVo);
        return webQuestionnaireShowVo;
    }

    public Boolean saveQuestionResult(WebQuestionnaireResultVo questionnaireResultVo) {
        // 问卷结果更新状态（关键修改：时间类型统一）
        LocalDateTime endDateTime = LocalDateTime.now(); // 直接使用 LocalDateTime
        QuestionnaireResultDO questionnaireResult = questionnaireResultMapper.selectById(questionnaireResultVo.getQrResultId());

        LocalDateTime startTime = questionnaireResult.getBqrStartTime(); // 直接获取 LocalDateTime 类型
        Long questTime = Duration.between(startTime, endDateTime).getSeconds(); // 无需额外转换

        QuestionnaireResultDO updateResultDO = new QuestionnaireResultDO()
            .setId(questionnaireResultVo.getQrResultId())
            .setBqrEndTime(endDateTime) // 改为 LocalDateTime 类型
            .setBqrQuestTime(questTime)
            .setBqrStatus("2");
        questionnaireResultMapper.updateById(updateResultDO);

        // 问题列表答案
        List<WebQuestionnaireResultVo.WebQuestion> questionList = questionnaireResultVo.getQuestionList();

        List<ConfigQuestionRespVO> configQuestionRespVOList = questionnaireMapper.selectConfigQuestionList(new ConfigQuestionRespVO().setQuestionnaireId(questionnaireResultVo.getQrId()));
        // 关键修改：将问题列表转换为ID到问题的映射（方便快速查找）
        Map<Long, ConfigQuestionRespVO> questionIdMap = configQuestionRespVOList.stream()
            .collect(Collectors.toMap(ConfigQuestionRespVO::getId, q -> q, (k1, k2) -> k1));

        // 试题答案（新增：获取正确答案逻辑）
        List<QuestionnaireResultDetailsDO> saveDetailsVOList = new ArrayList<>();
        questionList.forEach(webQuestion -> {
            QuestionnaireResultDetailsDO saveDetailsVO = new QuestionnaireResultDetailsDO();
            saveDetailsVO.setBqrdUserId(questionnaireResult.getBqrUserId())
                .setBqrdQuestionnaireId(questionnaireResultVo.getQrId())
                .setBqrdQuestionnaireResultId(questionnaireResultVo.getQrId())
                .setBqrdQuestionId(webQuestion.getQId())
                .setBqrdQuestOptionId(webQuestion.getOId())
                .setBqrdQuestOptionVId(webQuestion.getOVId());

            // 从configQuestionRespVOList中匹配当前试题的答案
            ConfigQuestionRespVO currentQuestion = questionIdMap.get(webQuestion.getQId());
            if (currentQuestion != null && currentQuestion.getCqQuestAnswerId() != null) {
                boolean isCorrect = Objects.equals(currentQuestion.getCqQuestAnswerId(), webQuestion.getOId());
                saveDetailsVO.setBqrdIsCorrect(isCorrect ? "1" : "2");
                saveDetailsVO.setBqrdQuestScore(isCorrect ? currentQuestion.getCqQuestScore() : 0);
            }
            saveDetailsVOList.add(saveDetailsVO);
        });

        //答题详情保存
        questionnaireResultDetailsMapper.insertBatch(saveDetailsVOList);

        // 问卷结果更新状态
        Double score = saveDetailsVOList.stream().mapToDouble(QuestionnaireResultDetailsDO::getBqrdQuestScore).sum();
        questionnaireResultMapper.updateById(new QuestionnaireResultDO()
                .setId(questionnaireResultVo.getQrResultId())
                .setBqrStatus("3")
                .setBqrScore(score));
        return true;
    }

}