package jnpf.cultivate.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import jnpf.model.cultivate.dto.learn.BatchCommonCountDto;
import jnpf.model.cultivate.po.position.FtbCultivatePosition;
import jnpf.model.cultivate.po.position.FtbCultivatePositionCourse;
import jnpf.model.cultivate.v2.course.vo.app.AppCourseSimpleVo;
import jnpf.model.cultivate.v2.position.req.V2OtherCultivatePositionCourseForAppReq;
import jnpf.model.cultivate.v2.position.vo.CultivatePositionSimpleVo;
import jnpf.model.cultivate.v2.position.vo.FtbCultivatePositionCourseWithNameVo;
import jnpf.model.cultivate.v2.position.vo.V2CultivatePositionDetailForApp;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface FtbCultivatePositionCourseMapper extends BaseMapper<FtbCultivatePositionCourse> {
    /**
     * 学习课程数
     */
    Long numberOfStudyCourses(@Param("postLearnId") String postLearnId);

    /**
     * 该岗位是否绑定课程
     */
    List<String> learnMapRelearn(@Param("positionId") String positionId);

    /**
     * 课程是否初始化
     */
    List<String> getAnExistingCoursePostId(@Param("postId") String postId);

    /**
     * 课程是否存在
     */
    List<String> getAnExistingCourse(@Param("courseIds") List<String> courseIds, @Param("userId") String userId);

    /**
     * 判断是否为最后一个岗位学习课程
     */
    Integer determineTheLastPostStudyCourse(@Param("postLearnId") String postLearnId);

    /**
     * 根据岗位学习ID列表统计课程数量
     *
     * @param positionLearnIds 岗位学习ID列表
     * @return BatchCommonCountDto对象列表，包含统计结果
     */
    List<BatchCommonCountDto> countByPositionLearnIds(@Param("positionLearnIds") List<String> positionLearnIds);

    /**
     * 查询所有岗位学习信息
     *
     * @param courseName 课程名称（可选查询条件）
     * @return CultivatePositionSimpleVo对象列表，包含岗位学习基本信息
     */
    List<CultivatePositionSimpleVo> queryAllPositionLearn(@Param("courseName") String courseName);

    /**
     * 查询岗位学习课程列表（移动端使用）
     *
     * @param params 查询参数对象，包含V2OtherCultivatePositionCourseForAppReq类型参数
     * @return AppCourseSimpleVo对象列表，包含课程简单信息
     */
    List<AppCourseSimpleVo> queryAllPositionLearnCourseLists(@Param("params") V2OtherCultivatePositionCourseForAppReq params);

    /**
     * 根据岗位学习ID、年级ID和考试ID查询培养岗位课程列表
     *
     * @param positionLearnId 岗位学习ID
     * @param gradeId         职级ID
     * @param examId          考试ID
     * @return FtbCultivatePositionCourse对象列表，包含培养岗位课程信息
     */
    List<FtbCultivatePositionCourse> listByPostLearnIdAndExamId(@Param("positionLearnId") String positionLearnId, @Param("gradeId") String gradeId, @Param("examId") String examId);

    /**
     * 根据岗位学习ID、年级ID和实践ID查询培养岗位课程列表
     *
     * @param positionLearnId 岗位学习ID
     * @param gradeId         职级ID
     * @param practiceId      练习id
     * @return FtbCultivatePositionCourse对象列表，包含培养岗位课程信息
     */
    List<FtbCultivatePositionCourse> listByPostLearnIdAndPracticeId(@Param("positionLearnId") String positionLearnId, @Param("gradeId") String gradeId, @Param("practiceId") String practiceId);

    /**
     * 根据岗位学习ID、年级ID和身份ID查询培养岗位课程列表
     *
     * @param positionLearnId 岗位学习ID
     * @param gradeId         职级ID
     * @param identityId      鉴定id
     * @return FtbCultivatePositionCourse对象列表，包含培养岗位课程信息
     */
    List<FtbCultivatePositionCourse> listByPostLearnIdAndIdentityId(@Param("positionLearnId") String positionLearnId, @Param("gradeId") String gradeId, @Param("practiceId") String identityId);

    /**
     * 查询所有岗位学习课程列表
     *
     * @param positionLearnId 岗位学习ID
     * @param gradeId         职级ID
     * @return FtbCultivatePositionCourse对象列表，包含岗位学习课程信息
     */
    List<FtbCultivatePositionCourse> queryAllPositionCourseAndLearnIdAndGradeId(@Param("positionLearnId") String positionLearnId, @Param("gradeId") String gradeId);

    List<FtbCultivatePositionCourseWithNameVo> listPositionCourseList(
            @Param("position") FtbCultivatePosition position,
            @Param("req") V2CultivatePositionDetailForApp req);

    /**
     * 根据岗位学习 ID 查询所有有效课程（关联课程表，过滤上架且未删除）
     *
     * @param postLearnId 岗位学习 ID
     * @param courseId    课程 ID
     * @return FtbCultivatePositionCourse 对象列表
     */
    List<FtbCultivatePositionCourseWithNameVo> listByPostLearnId(@Param("postLearnId") String postLearnId, @Param("courseId") String courseId);

    /**
     * 根据岗位学习 ID 和职级 ID 查询所有有效课程（关联课程表，过滤上架且未删除）
     *
     * @param postLearnId 岗位学习 ID
     * @param gradeId     职级 ID
     * @param courseId    课程 ID
     * @return FtbCultivatePositionCourse 对象列表
     */
    List<FtbCultivatePositionCourseWithNameVo> listByPostLearnIdAndGradeId(@Param("postLearnId") String postLearnId, @Param("gradeId") String gradeId, @Param("courseId") String courseId);

    List<String> queryPositionBindItem(@Param("position") FtbCultivatePosition position, @Param("gradeId") String gradeId);

    /**
     * 根据岗位学习ID查询所有有效课程（包含课程名称）
     *
     * @param postLearnId 岗位学习 ID
     * @param courseId    课程 ID
     * @return FtbCultivatePositionCourseWithNameVo 对象列表
     */
    List<FtbCultivatePositionCourseWithNameVo> listByPostLearnIdWithName(@Param("postLearnId") String postLearnId, @Param("courseId") String courseId);

    /**
     * 根据岗位学习配置查询所有课程ID列表（关联课程表过滤）
     *
     * @param postLearnId         岗位学习ID
     * @param isConfiguredToGrade 是否配置到职级（0-否，1-是）
     * @param gradeId             职级ID（仅当isConfiguredToGrade=1时有效）
     * @return 课程ID列表
     */
    List<String> queryCourseIdsByPositionAndGrade(@Param("postLearnId") String postLearnId,
                                                   @Param("isConfiguredToGrade") Integer isConfiguredToGrade,
                                                   @Param("gradeId") String gradeId);
}