package jnpf.model.cultivate.dto.course.testoption;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import jnpf.model.cultivate.dto.course.FtbCultivateCourseChapterDTO;
import jnpf.model.cultivate.po.course.FtbCultivateChapterTest;
import jnpf.model.cultivate.po.course.FtbCultivateChapterTestOption;
import lombok.Data;

import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

@Data
public class FtbCultivateChapterTestDTO {

    /**
     * 弹出问答时间，单位秒(开启必填)
     */
    private Integer forcedStudy;

    /**
     * 题目名(开启必填)
     */
    private String topicName;

    /**
     * 答案解析
     */
    private String answerAnalysis;

    public static <T extends FtbCultivateChapterTestDTO> FtbCultivateChapterTest convertFtbCultivateChapterTest(T ftbCultivateChapterTestDTO) {
        if (ftbCultivateChapterTestDTO == null) {
            return null;
        }
        FtbCultivateChapterTest ftbCultivateChapterTest = new FtbCultivateChapterTest();
        ftbCultivateChapterTest.setForcedStudy(ftbCultivateChapterTestDTO.getForcedStudy());
        ftbCultivateChapterTest.setTopicName(ftbCultivateChapterTestDTO.getTopicName());
        ftbCultivateChapterTest.setAnswerAnalysis(ftbCultivateChapterTestDTO.getAnswerAnalysis());
        return ftbCultivateChapterTest;
    }

    /**
     * 随堂测试校验
     */
    public static <T extends FtbCultivateChapterTestDTO> void checkChapterTest(T ftbCultivateChapterTestDTO) throws RuntimeException {
        if (ftbCultivateChapterTestDTO.getForcedStudy() == null) {
            throw new RuntimeException("问答设置秒数必填");
        }
        if (StrUtil.isBlank(ftbCultivateChapterTestDTO.getTopicName())) {
            throw new RuntimeException("题目名必填");
        }
        if (ftbCultivateChapterTestDTO.getTopicName().length() > 200) {
            throw new RuntimeException("题目名不能超过200个字符");
        }
        if (StrUtil.isNotBlank(ftbCultivateChapterTestDTO.getAnswerAnalysis())
                && ftbCultivateChapterTestDTO.getAnswerAnalysis().length() > 100) {
            throw new RuntimeException("答案解析不能超过100个字符");
        }
    }

    public static <T extends FtbCultivateChapterTestDTO> void checkForcedStudy(List<T> ftbCultivateChapterTestDTO, Integer totalTime) {
        if (totalTime < 5) {
            throw new RuntimeException("视频总时长不能小于5秒");
        }
        for (T t : ftbCultivateChapterTestDTO) {
            if (t.getForcedStudy() > totalTime) {
                throw new RuntimeException("触发问题的时间不能超过视频总时长");
            }
        }
    }

    public static void checkCourseChapterTestAdd(FtbCultivateCourseChapterDTO ftbCultivateCourseDTO) {
        if (ftbCultivateCourseDTO.getWhetherTesting() == 0) {
            if (CollUtil.isEmpty(ftbCultivateCourseDTO.getCultivateChapterTest())) {
                throw new RuntimeException("随堂测试内容不能为空");
            }
            if (ftbCultivateCourseDTO.getCultivateChapterTest().size() > 10) {
                throw new RuntimeException("题目上限为10题");
            }
            // 随堂测试内容校验
            for (FtbCultivateCourseChapterDTO.FtbCultivateChapterTestAddDTO ftbCultivateChapterTestAddDTO : ftbCultivateCourseDTO.getCultivateChapterTest()) {
                checkChapterTest(ftbCultivateChapterTestAddDTO);
                String topicName = ftbCultivateChapterTestAddDTO.getTopicName();
                if (CollUtil.isEmpty(ftbCultivateChapterTestAddDTO.getFetchChapterTestOptions())) {
                    throw new RuntimeException(topicName + "请添加选项");
                }
                if (ftbCultivateChapterTestAddDTO.getFetchChapterTestOptions().size() < 2
                        || ftbCultivateChapterTestAddDTO.getFetchChapterTestOptions().size() > 4) {
                    throw new RuntimeException(topicName + "选项介于2～4个之间");
                }
                for (FtbCultivateChapterTestOptionDTO ftbCultivateChapterTestOptionDTO : ftbCultivateChapterTestAddDTO.getFetchChapterTestOptions()) {
                    FtbCultivateChapterTestOptionDTO.checkChapterTestOptions(ftbCultivateChapterTestOptionDTO);
                }
                // 正确答案校验
                long isRightOption = ftbCultivateChapterTestAddDTO.getFetchChapterTestOptions()
                        .stream()
                        .map(FtbCultivateChapterTestOptionDTO::getIsRightOption)
                        .filter(Objects::nonNull)
                        .filter(a -> a == 1)
                        .count();
                if (isRightOption == 0) {
                    throw new RuntimeException(topicName + "请至少选择一个正确答案");
                }
            }
            // 学习时长是否有设置重复的
            Set<Integer> studyDuration = ftbCultivateCourseDTO.getCultivateChapterTest()
                    .stream()
                    .map(FtbCultivateChapterTestDTO::getForcedStudy)
                    .collect(Collectors.toSet());
            if (studyDuration.size() != ftbCultivateCourseDTO.getCultivateChapterTest().size()) {
                throw new RuntimeException("问答设置学习时长有重复");
            }
        }
    }

    public static void onTheGoTestDataAssembly(List<FtbCultivateChapterTest> chapterTests,
                                               List<FtbCultivateChapterTestOption> chapterOptionList,
                                               String chapterId,
                                               FtbCultivateCourseChapterDTO ftbCultivateCourseDTO) {
        for (FtbCultivateCourseChapterDTO.FtbCultivateChapterTestAddDTO ftbCultivateChapterTestAddDTO : ftbCultivateCourseDTO.getCultivateChapterTest()) {
            // 随堂测试
            FtbCultivateChapterTest ftbCultivateChapterTest = FtbCultivateChapterTestDTO.convertFtbCultivateChapterTest(ftbCultivateChapterTestAddDTO);
            ftbCultivateChapterTest.setCourseId(ftbCultivateCourseDTO.getCourseId());
            ftbCultivateChapterTest.setCourseChapterId(chapterId);
            ftbCultivateChapterTest.setId(IdWorker.getIdStr());
            // 随堂测试选项
            List<FtbCultivateChapterTestOption> ftbCultivateChapterTestOptions = ftbCultivateChapterTestAddDTO.getFetchChapterTestOptions()
                    .stream()
                    .map(FtbCultivateChapterTestOptionDTO::convertFtbCultivateChapterTestOption)
                    .peek(a -> a.setChapterTestId(ftbCultivateChapterTest.getId())).collect(Collectors.toList());
            chapterOptionList.addAll(ftbCultivateChapterTestOptions);
            chapterTests.add(ftbCultivateChapterTest);
        }

    }

}
