package com.ssj.service.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ssj.bean.conch.conch.dto.KmtQuestionDto;
import com.ssj.service.conch.parents.v2.dto.WrongBookKnowledgeDTO2;
import com.ssj.service.conch.parents.v2.dto.WrongBookQuestionDTO;
import com.ssj.service.conch.parents.v2.request.WrongBookQuestionReq3;
import com.ssj.service.kmt.exercisesys.dto.KmtTeacherDetailDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * @author yrf
 * @description
 * @time 2019/9/19 11:28
 */
@Mapper
public interface KmtQuestionMapper {

    /**
     * 查询提分训练推荐题目
     *
     * @param type 查询类型(1夯实基础，2同步提高)
     * @param knowHowDetailIdSet 关联知识点
     * @param excludeQuestionIdSet 排除这些题目
     * @return 题目列表
     */
    List<Map<String, Object>> findTrainRecommendQuestion(@Param("type") Integer type, @Param("knowHowDetailIdSet") Set<String> knowHowDetailIdSet, @Param("excludeQuestionIdSet") Set<String> excludeQuestionIdSet);

    /**
     * 查询整道大题（大题及大题所属所有小题）
     * @param parentId 大题id
     * @return 题目列表
     */
    List<Map<String, Object>> findFullQuestion(@Param("parentId") String parentId);

    /**
     * 查询提分训练推荐题目v2
     * @param recommendNumMap 题目类型、各难度数量
     * @param knowHowDetailIdSet 知识点id
     * @param excludeQuestionIdSet 排除这些题
     * @return kmt题目列表
     */
    List<Map<String, Object>> findTrainRecommendQuestionV2(@Param("recommendNumMap") Map<String, Integer> recommendNumMap,
                                                           @Param("knowHowDetailIdSet") Set<String> knowHowDetailIdSet,
                                                           @Param("excludeQuestionIdSet") Set<String> excludeQuestionIdSet);

    /**
     * 统计提分训练推荐题目数量v2
     * @param recommendNumMap 题目类型、各难度数量
     * @param knowHowDetailIdSet 知识点id
     * @param excludeQuestionIdSet 排除这些题
     * @return kmt题目数量统计结果
     */
    List<Map<String, Object>> countTrainRecommendQuestionV2(@Param("recommendNumMap") Map<String, Integer> recommendNumMap,
                                                            @Param("knowHowDetailIdSet") Set<String> knowHowDetailIdSet,
                                                            @Param("excludeQuestionIdSet") Set<String> excludeQuestionIdSet);

    /**
     * 查询num条知识点关联的kmt例题 type =1
     * @param howDetailIds
     * @param num
     * @return
     */
    List<KmtQuestionDto> findQuestionByHowDetailIds(@Param("howDetailIds") List<String> howDetailIds, @Param("count") int num);

    /**
     * 查询题目列表
     * @param list
     * @return
     */
    List<KmtQuestionDto> findQuestionByIds (@Param("list") List<String> list);

    /**
     * 查询错题知识点维度
     * @param type 查询类型，参考com.ssj.service.conch.parents.v2.request.ModuleReq
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTimeStr 开始时间
     * @param endDateTimeStr 结束时间
     */
    Set<String> findWrongQuestionKnowModuleList(@Param("type") Integer type, @Param("vipId") String vipId, @Param("subject") String subject, @Param("beginDateTimeStr") String beginDateTimeStr, @Param("endDateTimeStr") String endDateTimeStr);

    /**
     * 根据错题知识点维度查询错题知识点列表
     * @param type 查询类型，参考com.ssj.service.conch.parents.v2.request.WrongQuestionV2Req
     * @param vipId 学生id
     * @param subject 科目
     * @param module 知识点维度
     * @param beginDateTimeStr 开始时间
     * @param endDateTimeStr 结束时间
     */
    Page<WrongBookKnowledgeDTO2> findWrongQuestionKnowledgePage(IPage<WrongBookKnowledgeDTO2> page, @Param("type") Integer type, @Param("vipId") String vipId, @Param("subject") String subject, @Param("module") String module, @Param("beginDateTimeStr") String beginDateTimeStr, @Param("endDateTimeStr") String endDateTimeStr);

    /**
     * 根据错题知识点查询错题图片列表
     * @param page 分页
     * @param req com.ssj.service.conch.parents.v2.request.WrongBookQuestionReq3
     * @param includeDeleted 是否包含已删除的错题，0否，1是
     * @param beginDateTimeStr 开始时间
     * @param endDateTimeStr 结束时间
     */
    Page<WrongBookQuestionDTO> findWrongBookQuestionPage(@Param("page") IPage<WrongBookQuestionDTO> page, @Param("req") WrongBookQuestionReq3 req, @Param("includeDeleted") boolean includeDeleted, @Param("beginDateTimeStr") String beginDateTimeStr, @Param("endDateTimeStr") String endDateTimeStr);

    /**
     * 查询错题知识点维度
     * @param type 查询类型，参考com.ssj.service.conch.parents.v2.request.ModuleReq
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTimeStr 开始时间
     * @param endDateTimeStr 结束时间
     * @return 知识点维度列表
     */
    List<Map<String, Object>> findWrongQuestionKnowModuleListV2(@Param("type") Integer type, @Param("vipId") String vipId,
                                                                @Param("subject") String subject,
                                                                @Param("beginDateTimeStr") String beginDateTimeStr,
                                                                @Param("endDateTimeStr") String endDateTimeStr);

    /**
     * 通过考点id查询kmt题目
     * @param wrongQuestionHowDetailKdIdList 考点id
     * @param existQuestionIdSet 排除这些题目
     * @return 题目列表
     */
    List<Map<String, Object>> findByHowDetailKdId(@Param("wrongQuestionHowDetailKdIdList") List<String> wrongQuestionHowDetailKdIdList,
                                                  @Param("existQuestionIdSet") Set<String> existQuestionIdSet);

    /**
     * 查询错题知识点维度
     * @param type 查询类型，参考com.ssj.service.conch.parents.v2.request.ModuleReqV3
     * @param vipId 学生id
     * @param subject 科目
     * @param beginDateTimeStr 开始时间
     * @param endDateTimeStr 结束时间
     * @return 知识点维度列表
     */
    List<String> findWrongQuestionKnowModuleListV3New(@Param("vipId") String vipId, @Param("subject") String subject,
                                                      @Param("beginDateTimeStr") String beginDateTimeStr,
                                                      @Param("endDateTimeStr") String endDateTimeStr,
                                                      @Param("type") Integer type);

    /**
     * 根据错题知识点维度查询错题知识点列表
     * @param type 查询类型，参考com.ssj.service.conch.parents.v2.request.WrongQuestionV2Req
     * @param vipId 学生id
     * @param subject 科目
     * @param module 知识点维度
     * @param beginDateTimeStr 开始时间
     * @param endDateTimeStr 结束时间
     */
    Page<WrongBookKnowledgeDTO2> findWrongQuestionKnowledgePageV4New(@Param("page") IPage<WrongBookKnowledgeDTO2> page,
                                                                     @Param("type") Integer type,
                                                                     @Param("vipId") String vipId,
                                                                     @Param("subject") String subject,
                                                                     @Param("module") String module,
                                                                     @Param("beginDateTimeStr") String beginDateTimeStr,
                                                                     @Param("endDateTimeStr") String endDateTimeStr);

    /**
     * 查询kmt题目加载到es
     * @param pageSize 查询数量
     * @return 题目数据列表
     */
    List<Map<String, Object>> findAll2Es(@Param("pageSize") int pageSize);

    /**
     * 更新kmt题目的es加载状态
     * @param kmtQuestionKnowIdList 题目id列表
     * @param newEsLoaded 新的es加载状态
     * @return 更新行数
     */
    int updateEsLoadStatus(@Param("kmtQuestionKnowIdList") List<String> kmtQuestionKnowIdList,
                           @Param("newEsLoaded") int newEsLoaded);

    /**
     * 查询kmt加工审核老师详情列表
     * @param userId
     * @param detailName 搜索的知识点名称
     * @param page
     * @return
     */
    List<KmtTeacherDetailDto> findKmtTeacherDetails (@Param("userId")String userId,
                                                     @Param("detailName")String detailName,
                                                     @Param("type")int type,
                                                     Page page);
}
