package jnpf.cultivate.v2.service;

import jnpf.entity.cultivate.CultivateIdentifyApply;
import jnpf.entity.cultivate.CultivateIdentifyTable;
import jnpf.entity.cultivate.TeachingSkill;
import jnpf.model.cultivate.po.certificate.FtbCertificateEntity;
import jnpf.model.cultivate.po.certificate.FtbCertificateUserEntity;
import jnpf.model.cultivate.po.course.FtbCultivateCourse;
import jnpf.model.cultivate.po.exam.FtbCultivateExam;
import jnpf.model.cultivate.po.exam.FtbCultivateExamUser;
import jnpf.model.cultivate.po.position.FtbCultivatePositionCourceChapterLearning;
import jnpf.model.cultivate.po.position.FtbCultivatePositionCourceLearning;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionPostNew;
import jnpf.model.cultivate.v2.course.vo.app.V2ChapterVo;
import jnpf.model.cultivate.v2.position.req.FtbCultivatePositionSaveReq;
import jnpf.model.cultivate.v2.promotion.vo.PositionProgressVo;
import jnpf.model.cultivate.v2.statistics.V2BatchQueryResult;
import jnpf.model.cultivate.v2.task.req.V2CultivateTaskSaveReq;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * V2培养模块批量查询服务接口
 * 提供根据ID列表批量查询课程、考试、鉴定、证书、练习技能信息的功能
 */
public interface V2CultivateBatchQueryService {

    /**
     * 岗位学习检查考试可用性
     *
     * @param ftbCultivatePosition
     */
    void positionCheckAvailable(FtbCultivatePositionSaveReq ftbCultivatePosition);

    /**
     * 根据课程IDs批量查询课程信息
     *
     * @param courseIds        课程ID列表
     * @param isSelectNoDelete 0-查询有效的 1-查询删除的  null 查询全部
     * @return 课程信息Map，key为ID，value为课程实体
     */
    Map<String, FtbCultivateCourse> batchQueryCoursesByIds(List<String> courseIds, Integer isSelectNoDelete);

    /**
     * 根据考试IDs批量查询考试信息
     *
     * @param examIds          考试ID列表
     * @param isSelectNoDelete 0-查询有效的 1-查询删除的  null 查询全部
     * @return 考试信息Map，key为ID，value为考试实体
     */
    Map<String, FtbCultivateExam> batchQueryExamsByIds(List<String> examIds, Integer isSelectNoDelete);

    /**
     * 根据鉴定IDs批量查询鉴定信息
     *
     * @param identityIds      鉴定ID列表
     * @param isSelectNoDelete 0-查询有效的 1-查询删除的  null 查询全部
     * @return 鉴定信息Map，key为ID，value为鉴定实体
     */
    Map<String, CultivateIdentifyTable> batchQueryIdentificationsByIds(List<String> identityIds, Integer isSelectNoDelete);

    /**
     * 根据证书IDs批量查询证书信息
     *
     * @param certificateIds   证书ID列表
     * @param isSelectNoDelete 0-查询有效的 1-查询删除的  null 查询全部
     * @return 证书信息Map，key为ID，value为证书实体
     */
    Map<String, FtbCertificateEntity> batchQueryCertificatesByIds(List<String> certificateIds, Integer isSelectNoDelete);

    /**
     * 根据练习技能IDs批量查询技能信息
     *
     * @param practiceSkillIds 练习技能ID列表
     * @param isSelectNoDelete 0-查询有效的 1-查询删除的  null 查询全部
     * @return 技能信息Map，key为ID，value为技能实体
     */
    Map<String, TeachingSkill> batchQuerySkillsByIds(List<String> practiceSkillIds, Integer isSelectNoDelete);

    /**
     * 批量查询多种类型的信息
     *
     * @param courseIds        课程ID列表
     * @param examIds          考试ID列表
     * @param identityIds      鉴定ID列表
     * @param certificateIds   证书ID列表
     * @param practiceSkillIds 练习技能ID列表
     * @param isSelectNoDelete 0-查询有效的 1-查询删除的  null 查询全部
     * @return 包含所有查询结果的Map集合
     */
    V2BatchQueryResult batchQueryAllByIds(
            List<String> courseIds,
            List<String> examIds,
            List<String> identityIds,
            List<String> certificateIds,
            List<String> practiceSkillIds,
            Integer isSelectNoDelete
    );

    /**
     * 根据用户ID和课程ID列表批量查询用户的课程学习情况
     *
     * @param userId    用户ID列表
     * @param courseIds 课程ID列表
     * @return 课程学习情况Map，key为userId-courseId，value为学习情况实体
     */
    Map<String, FtbCultivatePositionCourceLearning> batchQueryUserCourseLearnStatus(String userId, List<String> courseIds);

    /**
     * 根据用户ID和考试ID列表批量查询用户的考试情况
     *
     * @param userId  用户ID列表
     * @param examIds 考试ID列表
     * @return 考试情况Map，key为userId-examId，value为考试情况实体
     */
    Map<String, FtbCultivateExamUser> batchQueryUserExamStatus(String userId, List<String> examIds);

    /**
     * 根据用户ID和鉴定ID列表批量查询用户的鉴定情况
     *
     * @param userId      用户ID列表
     * @param identifyIds 鉴定ID列表
     * @return 鉴定情况Map，key为userId-identifyId，value为鉴定情况实体
     */
    Map<String, CultivateIdentifyApply> batchQueryUserIdentificationStatus(String userId, List<String> identifyIds);

    Map<String, CultivateIdentifyApply> batchQueryUserIdentificationStatus(String userId, List<String> identifyIds, Integer source, String sourceId);

    /**
     * 根据用户ID和证书ID列表批量查询用户的证书获得情况
     *
     * @param userId         用户ID列表
     * @param certificateIds 证书ID列表
     * @return 证书获得情况Map，key为userId-certificateId，value为证书情况实体
     */
    Map<String, FtbCertificateUserEntity> batchQueryUserCertificateStatus(String userId, List<String> certificateIds);

    /**
     * 根据用户ID和技能ID列表批量查询用户的技能完成情况
     *
     * @param userId   用户ID列表
     * @param skillIds 技能ID列表
     * @return 技能完成情况Map，key为userId-skillId，value为练习情况实体
     */
    Map<String, List<String>> batchQueryUserSkillStatus(String userId, List<String> skillIds);


    /**
     * 根据课程ID列表批量查询每门课程的学习人数
     *
     * @param courseIds 课程ID列表
     * @return 课程学习人数Map，key为课程ID，value为学习人数
     */
    Map<String, Long> batchQueryCourseLearningCount(List<String> courseIds);

    /**
     * 任务可用性检查
     *
     * @param req 任务信息
     */
    void taskCheckAvailable(V2CultivateTaskSaveReq req);

    /**
     * 根据章节ID列表批量查询每章的课程学习人数
     *
     * @param chapterList 章节ID列表
     * @return 章节学习人数Map，key为章节ID，value为学习人数
     */
    Map<String, FtbCultivatePositionCourceChapterLearning> batchQueryCourseChapterLearningState(String userId, List<String> chapterList);

    /**
     * 根据岗位ID列表批量查询每个岗位的课程、考试、鉴定、练习数量统计
     *
     * @param postIds 岗位ID列表
     * @return 岗位进度统计Map，key为岗位ID，value为PositionProgressVo对象
     */
    Map<String, PositionProgressVo> batchQueryPositionProgress(List<FtbCultivatePromotionPostNew> postIds, String userId);

    /**
     * 根据用户ID和课程ID列表批量查询用户的课程学习情况(返回全部章节和章节的学习情况)
     *
     * @param userId    用户ID列表
     * @param courseIds 课程ID列表
     * @return 课程学习情况Map，key为课程id，value为章节列表
     */
    Map<String, List<V2ChapterVo>> batchQueryUserCourseChapterLearnStatus(String userId, List<String> courseIds);

    Map<String, BigDecimal> batchQueryUserCourseLearnProgress(String userId, List<String> courseIds);

    /**
     * 根据用户ID查询所有已完成学习的课程ID列表
     *
     * @param userId 用户ID
     * @return 已完成课程ID列表
     */
    List<String> getUserCompletedCourseIds(String userId);
}