package com.ssj.service.kmt.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ssj.bean.conch.conch.dto.KmtExerciseQuestionProblemDto;
import com.ssj.bean.kmt.kmt.domain.KmtExerciseQuestion;
import com.ssj.bean.kmt.kmt.domain.KmtExerciseQuestionRollback;
import com.ssj.bean.kmt.kmt.request.exercise.KmtHandlingQuestionRequest;
import com.ssj.bean.sys.homework.domain.HomeworkCount;
import com.ssj.framework.core.util.ResponseEntity;
import com.ssj.service.conch.parents.v2.dto.*;
import com.ssj.service.kmt.dto.*;
import com.ssj.service.kmt.dto.exercise.ExerciseQuestionRollbacks;
import com.ssj.service.kmt.dto.exercise.KmtExerciseBookLibDto;
import com.ssj.service.kmt.dto.exercise.KmtExerciseQuestionRollBackInfo;
import com.ssj.service.kmt.request.ExerciseBookIdDealTypeRequest;
import com.ssj.service.kmt.request.ExerciseConditionRequest;
import com.ssj.service.kmt.request.ExerciseQuestionsRequest;
import com.ssj.service.kmt.request.UnitAndPeriodListRequest;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author chchen
 * 类描述:练习册mybatis接口
 * 创建时间:2019/08/08 13:54
 */
public interface KmtExerciseMapperService {
    /**
     * in 查询题目列表
     * @param ids
     * @return
     */
    public List<KmtExerciseQuestion> findKmtExerciseQuestionsByIdIn (List<String> ids);

    /**
     * 删除上一次加工的知识点
     * @param questionIds
     * @return
     */
    public void deleteKmtExerciseQuestionKnowByQuestionIds (List<String> questionIds);

    /**
     * 题目列表提交审核
     * @param questionIds
     */
    public void updateKmtExerciseQuestion2Review (List<String> questionIds);


    /**
     * 查询整道错题关联的知识点，如果传入的题目id是一道小题，则返回这道大题所有小题关联的知识点，否则返回对应题目的知识点
     * @param questionId 题目id
     * @return 知识点id的列表
     */
    List<String> findWrongQuestionKnowHowDetailIdList(String questionId);

    /**
     * 根据错题知识点id列表和需要排除的题目id列表查询推荐的题目
     * @param wrongQuestionKnowHowDetailIdList 错题知识点id列表
     * @param needExcludedQuestionIdSet 需要排除的题目id列表
     * @param needNum
     * @return 原题dto列表
     */
    List<OriginalQuestionDTO> findRecommendQuestionList(List<String> wrongQuestionKnowHowDetailIdList, Set<String> needExcludedQuestionIdSet, int needNum);

    /**
     * 查询大小题题目
     *
     * @param parentIds 大题id
     * @param type 错题本打印原题时作为什么类型题目（1：原题，2：推荐题）
     *
     * @return 题目
     */
    List<OriginalQuestionDTO> findFullBigQuestionByParentIds(List<String> parentIds, int type);

    /**
     * 查询待加工审核的题目
     * @param userId 加工员/审核员
     * @return
     */
    List<ExerciseQuetionDto> findQuestionByBookCourseIdAndUserId (ExerciseQuestionsRequest request, Page page, String userId);

    /**
     * 查询打回列表
     * @param questionIds
     * @param dealType
     * @return
     */
    List<KmtExerciseQuestionRollback> findKmtExerciseQuestionRollbacks (List<String> questionIds, int dealType);

    /**
     * 查询题目的打回记录(新用户)
     * @param questionId
     * @return
     */
    List<KmtExerciseQuestionRollBackInfo> findQuestionRollbackRecord(String questionId);

    /**
     * 查询题目的打回记录（老用户）
     * @param questionId
     * @return
     */
    List<ExerciseQuestionRollbacks> findQuestionRollbackRecordOld(String questionId);

    /**
     * 计算学习得分
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     * @return 得分
     */
    int computeLearningScore(String vipId, String subject, Date beginDateTime, Date endDateTime);

    /**
     * 获取知识点占比列表
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     * @return 知识点占比列表
     */
    List<KnowledgePointProportionDTO> getKnowledgePointProportionList(String vipId, String subject, Date beginDateTime, Date endDateTime);

    /**
     * 获取知识点掌握情况列表
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     * @return 知识点掌握情况列表
     */
    List<KnowledgePointMasteryDTO> getKnowledgePointMasteryList(String vipId, String subject, Date beginDateTime, Date endDateTime);

    /**
     * 获取知识点掌握情况列表（根据知识点维度分组）
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     * @return 知识点掌握情况列表
     */
    List<ModuleDTO> getModuleList(String vipId, String subject, Date beginDateTime, Date endDateTime);

    /**
     * 查询月作业统计数据
     * @param vipId 学生id
     * @param homeworkMonth 月份，如："2019-06"
     */
    HomeworkCount findMonthHomeworkCount(String vipId, String homeworkMonth);

    /**
     * 获取学科知识点学习情况
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     */
    SubjectKnowledgeInfoDTO getSubjectKnowledgeInfoDTO(String vipId, String subject, Date beginDateTime, Date endDateTime);

    /**
     * 查询相似题
     * @param ids
     * @return
     */
    List<KmtExerciseQuestionProblemDto> findSimilarQuestionByIds (List<String> ids);

    /**
     * 获取学科知识点学习情况
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     */
    SubjectKnowledgeInfoDTOV2 getSubjectKnowledgeInfoDTOV2(String vipId, String subject, Date beginDateTime, Date endDateTime);

    /**
     * 获取知识点掌握情况列表（根据知识点维度分组）
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTime 开始时间
     * @param endDateTime 结束时间
     * @param subjectKnowledgeInfoDTOV2
     * @return 知识点掌握情况列表
     */
    List<ModuleDTO> getModuleListV2(String vipId, String subject, Date beginDateTime, Date endDateTime, SubjectKnowledgeInfoDTOV2 subjectKnowledgeInfoDTOV2);

    /**
     * 根据练习册id列表查询需要更新到es的数据
     * @param questionIdList 题目id列表
     */
    List<Map<String, Object>> findData2EsByQuestionList(List<String> questionIdList);

    /**
     * 全量更新es索引kmt_exercise_question_know中的数据
     * @return
     */
    long updateTotal2Es();

    /**
     * 查询练习册
     * @param request
     * @param userId
     * @return
     */
    List<ExerciseBookDto> findExerciseBooks (ExerciseConditionRequest request, String userId);

    /**
     * 查询练习册的单元课时
     * @param request
     * @return
     */
    List<ExerciseBookUnitDto> findExerciseBookDetail (ExerciseBookIdDealTypeRequest request, String userId);

    /**
     * 查询kmt的题目 kmt_exercise_questions
     * @param request
     * @param userId
     * @return
     */
    Map<String, Object> getKmtHandlingQuestions (KmtHandlingQuestionRequest request, String userId);

    /**
     * 拼接大题目
     * @param questions
     * @return
     */
    List<ExerciseQuetionDto> findAndAppendBigQuestion2List (List<ExerciseQuetionDto> questions);

    /**
     * 根据给定知识点id列表和知识点版本，统计练习册题目数量
     * @param knowledgeIdList 知识点id列表
     * @param version 知识点版本
     * @return 题目数量
     */
    int countQuestionByKnowledgeAndVersion(List<String> knowledgeIdList, int version);

    /**
     * es字段转成实体字段
     * @param list
     * @return
     */
    List<ExerciseQuetionDto> parseMapToExerciseQuestionList (List<Map> list);

    /**
     * 查询所有大小题题目
     * @param parentIds
     * @return
     */
    ResponseEntity findQuestionListByParentId(List<String> parentIds);

    /**
     * 查询练习册单元课时列表2
     *
     * @param request 入参
     *
     * @return 单元课时列表
     */
    List<ExerciseBookUnitDto> findUnitAndPeriodList(UnitAndPeriodListRequest request);

    /**
     * 查询题目的正确格式
     * @return
     */
    List<ExerciseBookCourseClassDto> findClassifyQuestionsByIds (List<String> questionIds);


    /**
     * 查询机构识别率相关计算
     */
    List<KmtExerciseBookLibDto> findOrgCount(String libId, String subject);
}
