package com.seer.teach.teacher.service;

import com.seer.teach.teacher.module.entity.KnowledgePointEntity;
import com.seer.teach.teacher.module.entity.MaterialEntity;
import com.seer.teach.teacher.module.entity.UnitKnowMappingEntity;
import com.seer.teach.teacher.module.entity.UnitsEntity;
import com.seer.teach.teacher.module.entity.VersionsEntity;
import com.seer.teach.teacher.module.param.KnowledgePointSearchParam;

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

/**
 * <p>
 * 知识点查询服务类
 * </p>
 *
 * @author Wang
 * @since 2025-10-09 15:20:36
 */
public interface KnowledgePointQueryService  {

    /**
     * 根据年级ID列表获取单元ID列表
     *
     * @param gradeIds 年级ID列表
     * @return 单元ID列表
     */
    Collection<Integer> getUnitIdsByGradeIds(Set<Integer> gradeIds);

    /**
     * 根据年级ID列表，版本ID列表，学科ID列表获取知识点ID列表
     *
     * @param gradeIds 年级ID列表
     * @param versionIds 版本ID列表
     * @param subjectIds 科目ID列表
     * @return 单元ID列表
     */
    Collection<Integer> getUnitIdsByGradeIdsAndVersionIdsAndSubjetIds(Set<Integer> gradeIds, Set<Integer> versionIds, Set<Integer> subjectIds);

    /**
     * 根据年级ID列表和学科ID列表获取单元ID列表
     *
     * @param gradeIds 年级ID列表
     * @param versionIds 版本ID列表
     * @return 单元ID列表
     */
    Collection<Integer> getUnitIdsByGradeIdsAndVersionIds(Set<Integer> gradeIds, Set<Integer> versionIds);

    /**
     * 根据年级ID列表，版本ID列表，学科ID列表获取知识点ID列表
     *
     * @param param 查询参数
     * @return 知识点ID列表
     */
    Collection<Integer> getKnowIdsByConditions(KnowledgePointSearchParam param);

    /**
     * 根据年级ID列表和学科ID列表获取知识点ID列表
     *
     * @param gradeIds 年级ID列表
     * @param subjectIds 学科ID列表
     * @return 知识点ID列表
     */
    Collection<KnowledgePointEntity> getKnowListByGradeIdsAndSubjectIdsOrElseEmpty(Set<Integer> gradeIds, Set<Integer> subjectIds);

    /**
     * 根据年级ID列表和学科ID列表获取知识点ID列表
     *
     * @param gradeIds 年级ID列表
     * @param versionIds 版本ID列表
     * @return 单元ID列表
     */
    Collection<Integer> getKnowIdsByGradeIdsAndVersionIds(Set<Integer> gradeIds, Set<Integer> versionIds) ;

    /**
     * 根据单元ID列表获取单元知识点映射列表
     *
     * @param unitIds 单元ID列表
     * @return 单元知识点映射列表
     */
    Collection<UnitKnowMappingEntity> getUnitKnowMappingListByUnitIds(Collection<Integer> unitIds);

    /**
     * 根据知识点ID列表获取知识点列表
     *
     * @param knowIds 知识点ID列表
     * @return 知识点列表
     */
    Collection<UnitKnowMappingEntity> getUnitKnowMappingListByKnowIds(Collection<Integer> knowIds);

    /**
     * 根据知识点ID获取单元知识点映射列表
     *
     * @param knowId 知识点ID
     * @return 单元知识点映射列表
     */
    Collection<UnitKnowMappingEntity> getUnitKnowMappingListByKnowId(Integer knowId);

    /**
     * 根据单元ID和知识点ID获取单元知识点映射
     *
     * @param unitId 单元ID
     * @param knowId 知识点ID
     * @return 单元知识点映射
     */
    UnitKnowMappingEntity getUnitKnowMappingByUnitIdAndKnowId(Integer unitId, Integer knowId);

    /**
     * 根据知识点ID列表获取知识点列表,如果knowIds为空则查询所有知识点
     *
     * @param knowIds 知识点ID列表
     * @return 知识点列表
     */
    Collection<KnowledgePointEntity> getKnowledgePointListByKnowIds(Collection<Integer> knowIds);

    /**
     * 根据知识点ID列表获取知识点列表
     *
     * @param knowIds 知识点ID列表
     * @param knowName 知识点名称
     * @return 知识点列表
     */
    Collection<KnowledgePointEntity> getKnowledgePointListByKnowIdsOrName(Collection<Integer> knowIds, String knowName);

    /**
     * 根据知识点ID列表获取知识点列表,如果knowIds为空则查询所有知识点
     *
     * @param knowIds 知识点ID列表
     * @return 知识点列表
     */
    Collection<KnowledgePointEntity> getKnowledgePointListByIdsOrElseAll(Collection<Integer> knowIds);

    /**
     * 根据学科ID获取知识点列表
     *
     * @param subjectId 学科ID
     * @return 知识点列表
     */
    Collection<KnowledgePointEntity> getKnowledgePointListBySubjectId(Integer subjectId);
    /**
     * 根据知识点ID获取知识点
     *
     * @param knowId 知识点ID
     * @return 知识点
     */
    KnowledgePointEntity getKnowledgePointByKnowId(Integer knowId);

    /**
     * 根据知识点ID获取单元ID列表
     *
     * @param knowId 知识点ID
     * @return 单元ID列表
     */
    Collection<Integer> getUnitIdsByKnowId(Integer knowId);

     /**
     * 根据单元ID获取单元
     *
     * @param unitId 单元ID
     * @return 单元
     */
    UnitsEntity getUnitByUnitId(Integer unitId);

    /**
     * 根据单元id获取知识点Id列表
     *
     * @param unitId 单元ID
     * @return 知识点ID列表
     */
    Collection<Integer> getKnowIdListByUnitId(Integer unitId);

    /**
     * 根据单元ID列表获取知识点ID列表
     *
     * @param unitIds 单元ID列表
     * @return 知识点ID列表
     */
    Collection<Integer> getKnowIdListByUnitIds(Collection<Integer> unitIds);

    /**
     * 根据知识点ID列表获取知识点ID
     *
     * @param knowId 知识点ID
     * @return 单元ID
     */
    Integer getUnitIdByKnowId(Integer knowId);

    /**
     * 根据教材ID列表获取单元列表
     *
     * @param materialIds 教材ID列表
     * @return 单元列表
     */
    List<UnitsEntity> getUnitListByMaterialIds(Collection<Integer> materialIds);

    /**
     * 根据教材ID列表获取单元列表
     *
     * @param unitIds 单元ID列表
     * @return 单元列表
     */
    List<UnitsEntity> getUnitListByUnitIds(Collection<Integer> unitIds);

    /**
     * 根据学科ID获取对应的教材版本列表
     *
     * @param subjectIds 学科ID
     * @return 教材版本列表
     */
    List<VersionsEntity> getVersionListBySubjectIds(Collection<Integer> subjectIds);

    /**
     * 根据知识点ID获取对应的教材列表
     *
     * @param knowId 知识点ID
     * @return 教材列表
     */
    Collection<MaterialEntity> getMaterialListByKnowId(Integer knowId);

    /**
     * 根据教材ID列表获取教材列表
     *
     * @param materialIds 教材ID列表
     * @return 教材列表
     */
    Collection<MaterialEntity> getMaterialListByMaterialIds(Collection<Integer> materialIds);

    /**
     * 根据教材ID获取教材
     *
     * @param materialId 教材ID
     * @return 教材
     */
    MaterialEntity getMaterialByMaterialId(Integer materialId);

    /**
     * 根据知识点ID列表获取对应的教材列表
     *
     * @param knowIds 知识点ID列表
     * @return 教材列表
     */
    Collection<MaterialEntity> getMaterialListByKnowIds(Collection<Integer>  knowIds);

    /**
     * 根据知识点ID列表获取对应的教材列表
     *
     * @param knowIds 知识点ID列表
     * @return 教材列表
     */
    Map<Integer, List<MaterialEntity>> getKnowIdMaterialRelationByKnowIds(Collection<Integer> knowIds);

    /**
     * 根据知识点ID列表获取对应的教材列表
     *
     * @param knowIds 知识点ID列表
     * @return 教材列表
     */
    Map<Integer, List<UnitsEntity>> getKnowIdUnitRelationByKnowIds(Collection<Integer> knowIds);

    /**
     * 根据版本ID列表获取教材版本列表
     *
     * @param versionIds 教材ID列表
     * @return 教材版本列表
     */
    Collection<VersionsEntity> getVersionListByVersionIds(Collection<Integer> versionIds);

    /**
     * 根据教材ID获取教材版本
     *
     * @param versionId 教材ID
     * @return 教材版本
     */
    VersionsEntity getVersionByVersionId(Integer versionId);
    
    /**
     * 根据知识点ID获取知识点所属学科名称
     *
     * @param knowId 知识点ID
     * @return 学科名称
     */
    String getSubjectNameByKnowId(Integer knowId);
    
    /**
     * 根据知识点ID获取知识点所属年级名称列表
     *
     * @param knowId 知识点ID
     * @return 年级名称列表
     */
    List<String> getGradeNamesByKnowId(Integer knowId);

}