package jnpf.cultivate.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.model.cultivate.dto.course.FtbCultivateSelectPositionDto;
import jnpf.model.cultivate.dto.learn.BatchCommonCountDto;
import jnpf.model.cultivate.dto.promotion.FtbCultivatePromotionDto;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionMemberNew;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionNew;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionPostNew;
import jnpf.model.cultivate.v2.position.vo.CultivateUserPositionVo;
import jnpf.model.cultivate.v2.promotion.req.FtbCultivatePromotionReq;
import jnpf.model.cultivate.v2.promotion.req.V2PromotionOrgStatisticReq;
import jnpf.model.cultivate.v2.promotion.req.V2PromotionPersonStatisticReq;
import jnpf.model.cultivate.v2.promotion.vo.PromotionAndPostVo;
import jnpf.model.cultivate.v2.promotion.vo.V2CultivatePromotionOrgStatisticVo;
import jnpf.model.cultivate.v2.promotion.vo.V2CultivatePromotionPersonStatisticVo;
import jnpf.model.cultivate.v2.promotion.vo.WebCultivatePromotionListVo;
import jnpf.model.cultivate.vo.course.app.FtbGlobalCurriculumAppVO;
import jnpf.model.cultivate.vo.promotion.FtbCultivateLearnMapInfoVO;
import jnpf.model.cultivate.vo.promotion.FtbCultivatePromotionMeberPostInfo;
import jnpf.model.cultivate.vo.promotion.FtbCultivatePromotionNewVO;
import jnpf.model.personnels.vo.apply.FtbPersonnelsCourseVO;
import jnpf.permission.vo.v2.user.UserPageListVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 *  查询岗位通道
 * @author hao.peng
 */
public interface FtbCultivatePromotionNewMapper extends BaseMapper<FtbCultivatePromotionNew> {
/**
 * 获取培养推广列表
 *
 * @param page 分页对象，包含分页参数和数据
 * @param dto  查询条件对象，用于筛选列表数据
 * @return 包含分页数据的Page对象
 */
Page<FtbCultivatePromotionNewVO> getList(@Param("page") Page<FtbCultivatePromotionNewVO> page,
                                         @Param("dto") FtbCultivatePromotionDto dto);

/**
 * 查询学习范围
 *
 * @param id 查询对象的唯一标识符
 * @return 学习范围的数量
 */
Integer queryStudyScope(@Param("id") String id);

/**
 * 查询初始化岗位
 *
 * @param promotionId 推广活动的唯一标识符
 * @return 包含渠道名称和ID的Map对象
 */
@Select(" SELECT\n" +
        "        po.F_PostName channelIniName,\n" +
        "        po.F_PostId channelId\n" +
        "        FROM\n" +
        "        ftb_cultivate_promotion_new AS pr\n" +
        "        LEFT JOIN ftb_cultivate_promotion_post_new AS po ON pr.F_Id = po.F_PromotionId\n" +
        "        where\n" +
        "        pr.F_EnableMark=0\n" +
        "        AND po.F_Level = 1 and pr.F_Id = #{promotionId}")
Map<String,String> queryInitializationPositions(@Param("promotionId") String promotionId);

/**
 * 获取某人选择的岗位信息
 *
 * @param id 人员的唯一标识符
 * @return 该人员选择的岗位信息列表
 */
List<FtbCultivatePromotionMeberPostInfo> getThePositionThisPersonHasChosen(@Param("id") String id);

/**
 * 查询用户选择的岗位
 *
 * @param userId 用户的唯一标识符
 * @param integer 数字参数，用途需文档化
 * @param id 用户的唯一标识符（冗余参数，应与userId相同）
 * @return 用户选择的岗位列表
 */
List<String> queryUserChosesPosts(@Param("userId")String userId,@Param("integer") Integer integer,@Param("id") String id);

/**
 * 基于岗位查看学习地图
 *
 * @param userId 用户的唯一标识符
 * @param postId 岗位的唯一标识符
 * @param level 岗位级别
 * @return 学习地图信息列表
 */
List<FtbCultivateLearnMapInfoVO> viewLearningMapBasedOnPosition(@Param("userId") String userId,
                                                                @Param("postId")  String postId,
                                                                @Param("level") Integer level);
@Select("    SELECT\n" +
        "        pr.F_Id\n" +
        "        FROM\n" +
        "        ftb_cultivate_promotion_new AS pr\n" +
        "        inner JOIN ftb_cultivate_promotion_post_new AS po ON pr.F_Id = po.F_PromotionId\n" +
        "        where\n" +
        "        pr.F_EnableMark=0\n" +
        "        AND po.F_Level = 1\n" +
        "\t\t\t\tAND po.F_PostId =#{postId}")
String initialPositionQueryLearningMapPrimaryKey(@Param("postId") String postId);

/**
 * 查询用户选择的岗位及其ID
 *
 * @param userId 用户的唯一标识符
 * @param level 岗位级别
 * @param promotionId 推广活动的唯一标识符
 * @return 包含用户选择的岗位及其ID的列表
 */
List<Map<String, Object>> queryUserChosesPostsWitId(@Param("userId") String userId,
                                                   @Param("level") Integer level,
                                                   @Param("promotionId") String promotionId);

    /**
     * 查询用户选择的岗位及其ID
     *
     * @param userId 用户的唯一标识符
     * @param promotionId 推广活动的唯一标识符
     * @return 包含用户选择的岗位及其ID的列表
     */
    List<FtbCultivateSelectPositionDto> queryUserChosesPositionIdWidthId(@Param("userId") String userId,
                                                                   @Param("promotionId") String promotionId);

/**
 * 查询推广活动的阶段数量
 *
 * @param promotionId 推广活动的唯一标识符
 * @return 推广活动的阶段数量
 */
Integer queryHowManyStages(@Param("promotionId") String promotionId);

/**
 * 在职学习课程查询
 *
 * @param userId 用户的唯一标识符
 * @param postIds 岗位ID列表
 * @param compulsory 是否为必修课程的标志（0：非必修，1：必修）
 * @return 课程信息列表
 */
List<FtbGlobalCurriculumAppVO> onTheJobLearningCourse(@Param("userId") String userId, @Param("postIds") List<String> postIds, @Param("compulsory") Integer compulsory);

/**
 * 在职学习课程查询
 *
 * @param userId 用户的唯一标识符
 * @param postIds 岗位ID列表
 * @param compulsory 是否为必修课程的标志（0：非必修，1：必修）
 * @return 课程信息列表
 */
List<FtbGlobalCurriculumAppVO> onTheJobLearningCourseNew(@Param("userId") String userId, @Param("postIds") List<String> postIds, @Param("compulsory") Integer compulsory);

/**
 * 基于岗位ID查询已选人员
 *
 * @param postIds 岗位ID列表
 * @return 选中人员的列表
 */
List<String> querySelectedPersonnelBasedOnPositionID(@Param("postIds") List<String> postIds);

/**
 * 查询实践考核学习数量
 *
 * @param studyPostIds 学习岗位ID列表
 * @param userId 用户的唯一标识符
 * @param isAPracticalAppraisalIds 是否为实践考核的ID列表
 * @param learningMapSetting 学习地图设置标志
 * @return 符合条件的学习数量
 */
Integer queryTheNumberOfPracticalAppraisalStudies(@Param("studyPostIds") List<String> studyPostIds,
                                                   @Param("userId") String userId,
                                                   @Param("isAPracticalAppraisalIds") List<String> isAPracticalAppraisalIds,
                                                   @Param("learningMapSetting") Integer learningMapSetting);

/**
 * 检查岗位是否有考试
 *
 * @param postId 岗位的唯一标识符
 * @return 是否有考试的标志（0：否，1：是）
 */
Integer checkIfThereAreExamsForThisPosition(@Param("postId")String postId);

/**
 * 检查岗位是否有实践考核
 *
 * @param postId 岗位的唯一标识符
 * @return 是否有实践考核的标志列表
 */
List<String> checkWhetherThereIsAPracticalAppraisal(@Param("postId")String postId);

/**
 * 查询用户选择的岗位ID
 *
 * @param userId 用户的唯一标识符
 * @param id 推广活动的唯一标识符
 * @return 用户选择的岗位ID列表
 */
List<String> queryChosePostId(@Param("userId") String userId,@Param("id")   String id);

/**
 * 查询用户学习过的岗位信息
 *
 * @param id 推广活动的唯一标识符
 * @param channelIniId 渠道初始化ID
 * @return 用户学习过的岗位信息列表
 */
List<FtbCultivatePromotionMemberNew> queryTheUserSLearnedPositionInformation(@Param("id") String id,
                                                                             @Param("channelIniId") String channelIniId);

/**
 * 查询学习过的岗位ID
 *
 * @param postId 岗位的唯一标识符
 * @return 包含学习过的岗位ID的Map列表
 */
List<Map<String, String>> doQueryTheLearnedPositionIdFirst(@Param("postId") String postId);

/**
 * 查询用户学习进度
 *
 * @param userId 用户的唯一标识符
 * @param studyPostIds 学习过的岗位ID列表
 * @param state 学习状态列表
 * @return 学习进度数量
 */
Integer doQueryTheLearnedPositionIdSecond(@Param("userId") String userId, @Param("studyPostIds") List<String> studyPostIds,
                                          @Param("state") List<Integer> state);

/**
 * 查询用户学习进度（新方法）
 *
 * @param userIds 用户的唯一标识符列表
 * @param studyPostIds 学习过的岗位ID列表
 * @param state 学习状态列表
 * @return 学习进度信息列表
 */
List<FtbPersonnelsCourseVO> doQueryTheLearnedPositionIdSecondNew(@Param("userIds") List<String> userIds , @Param("studyPostIds") List<String> studyPostIds,
                                                                 @Param("state") List<Integer> state);

/**
 * 默认方法：查询用户已学习的岗位
 *
 * @param userId 用户的唯一标识符
 * @param state 学习状态列表
 * @param postId 岗位的唯一标识符
 * @return 用户已学习的岗位ID字符串，以逗号分隔
 */
default String queryThePositionsThatUsersHaveLearned(String userId, List<Integer> state,String postId) {
    List<Map<String, String>> maps = doQueryTheLearnedPositionIdFirst(postId);
    List<String> result = new ArrayList<>();
    for (Map<String, String> map : maps) {
        List<String> courseIds = List.of(map.get("courseIds").split(","));
        if (doQueryTheLearnedPositionIdSecond(userId, courseIds,state) == courseIds.size()) {
            result.add(map.get("postId"));
        }
    }
    return String.join(",", result);
}

/**
 * 默认方法：查询用户已学习的岗位
 *
 * @param userId 用户的唯一标识符
 * @param list 学习状态列表
 * @return 用户已学习的岗位ID字符串，以逗号分隔
 */
default String queryThePositionsThatUsersHaveLearned(String userId,List<Integer> list) {
    List<Map<String, String>> maps = doQueryTheLearnedPositionIdFirst(null);
    List<String> result = new ArrayList<>();
    for (Map<String, String> map : maps) {
        List<String> courseIds = List.of(map.get("courseIds").split(","));
        if (doQueryTheLearnedPositionIdSecond(userId, courseIds,list) > 0) {
            result.add(map.get("postId"));
        }
    }
    return String.join(",", result);
}

/**
 * 查询推广活动的岗位ID列表
 *
 * @param promotionId 推广活动的唯一标识符
 * @return 岗位ID列表
 */
List<String> queryMapPostId(@Param("promotionId") String promotionId);

/**
 * 检查岗位是否有课程
 *
 * @param postId 岗位的唯一标识符
 * @return 是否有课程的标志（0：否，1：是）
 */
Integer checkIfThePositionHasCourses(@Param("postId")String postId);

/**
 * 检查岗位是否有实践考核（新方法）
 *
 * @param postId 岗位的唯一标识符
 * @param userId 用户的唯一标识符
 * @return 是否有实践考核的标志列表
 */
List<String> checkWhetherThereIsAPracticalAppraisalWithNew(@Param("postId") String postId,@Param("userId") String userId);

/**
 * 检查岗位是否有考试（新方法）
 *
 * @param positionId 岗位的唯一标识符
 * @param userId 用户的唯一标识符
 * @return 是否有考试的标志列表
 */
List<String> checkIfThereAreExamsForThisPositionWithNew(@Param("postId") String positionId,@Param("userId") String userId);

    /**
     * 查询学习地图的岗位配置
     * @param pomotionId 学习地图id
     * @param currentLearningStage 阶段
     * @return
     */
    List<FtbCultivatePromotionPostNew> selectPromoteList(@Param("pomotionId") String pomotionId, @Param("currentLearningStage") Integer currentLearningStage);


/**
 * 查询推广岗位列表
 *
 * @param pomotionId 学习地图id
 * @return 学习地图下的岗位
 */
List<FtbCultivatePromotionPostNew> selectAllPromoteList(@Param("pomotionId") String pomotionId);

List<PromotionAndPostVo> countByPositionIds(@Param("positionIds") List<String> positionIds);

Page<WebCultivatePromotionListVo> webList(@Param("page") Page<WebCultivatePromotionListVo> page, @Param("params") FtbCultivatePromotionReq params);

    List<BatchCommonCountDto> queryMaxLevel(@Param("promotionIds") List<String> promotionIds);

    Page<V2CultivatePromotionPersonStatisticVo> personStatisticsV2(@Param("params") V2PromotionPersonStatisticReq params,
                                                                   @Param("userIds") List<String> userIds,
                                                                   @Param("page") Page<V2CultivatePromotionPersonStatisticVo> page);

    List<CultivateUserPositionVo> queryPromotionPosition(@Param("userIds") List<String> userIds);

    Page<V2CultivatePromotionOrgStatisticVo> mapStatisticPageV2(@Param("page") Page<V2CultivatePromotionOrgStatisticVo> page,
                                                                @Param("params") V2PromotionOrgStatisticReq params,
                                                                @Param("userIds")  List<String> userIds);

    List<BatchCommonCountDto> userCountForPromotion(@Param("userIds") List<String> userIds);

    List<BatchCommonCountDto> queryPositionNumForMap(@Param("promotionIds") List<String> promotionIds);
}
