package jnpf.cultivate.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.base.vo.PageListVO;
import jnpf.model.cultivate.CultivatePage;
import jnpf.model.cultivate.dto.learn.BatchCommonCountDto;
import jnpf.model.cultivate.dto.promotion.FtbCultivateCreatMeMapInfoDTO;
import jnpf.model.cultivate.dto.promotion.FtbCultivatePromotionCreatNewDto;
import jnpf.model.cultivate.dto.promotion.FtbCultivatePromotionDto;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionNew;
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.V2CultivatePromotionOrgStatisticVo;
import jnpf.model.cultivate.v2.promotion.vo.V2CultivatePromotionPersonStatisticVo;
import jnpf.model.cultivate.v2.promotion.vo.WebCultivatePromotionListVo;
import jnpf.model.cultivate.vo.promotion.*;
import jnpf.permission.vo.v2.user.UserPageListVO;

import java.util.List;

/**
 * @Title: FtbCultivatePromotionNewService
 * @Author: peng.hao
 * @create: 2024/3/27 11:37
 */
public interface FtbCultivatePromotionNewService  extends IService<FtbCultivatePromotionNew> {
    /**
     * 获取促销列表
     * @param page 分页信息
     * @param dto 查询条件
     * @return 返回分页的促销列表
     */
    PageListVO<FtbCultivatePromotionNewVO> getList(CultivatePage page, FtbCultivatePromotionDto dto);

    /**
     * 添加促销信息
     * @param creatDto 添加促销的信息
     */
    void add(FtbCultivatePromotionCreatNewDto creatDto);

    /**
     * 更新促销信息
     * @param creatDto 更新后的促销信息
     */
    void updatePromotion(FtbCultivatePromotionCreatNewDto creatDto);

    /**
     * 根据ID删除促销信息
     * @param id 促销信息ID
     * @param b 删除标志
     * @return 返回删除结果
     */
    String deleteById(String id, boolean b);

    /**
     * 根据初始化岗位,查看学习地图
     * @param channelIniPoId 岗位ID
     * @return 返回学习地图信息
     */
    FtbCultivatePromotionLevelMapVO getLearnMapLevels(String channelIniPoId);

    /**
     * 根据初始化岗位,获取岗位个数
     * @param channelIniPoId 岗位ID
     * @return 返回岗位个数
     */
    Integer getMapPostNumber(String channelIniPoId);

    /**
     * 根据学习地图id,查看学习地图
     * @param mapId 学习地图ID
     * @return 返回学习地图信息
     */
    FtbCultivatePromotionLevelMapVO getLearnMapLevelsWithMapId(String mapId);

    /**
     * 根据ID获取当前学习地图绑定成员信息
     * @param id 地图ID
     * @return 返回当前学习地图绑定成员信息
     */
    FtbCultivatePromotionStudyDeleteInfo getTheCurrentMapBindingMembers(String id);

    /**
     * 根据ID和分页信息获取促销详情
     * @param id 促销信息ID
     * @param page 分页信息
     * @return 返回促销详情
     */
    FtbCultivateStudyMemberInfo getPromotionById(String id, CultivatePage page);

    /**
     * 查询当前用户学习地图等级
     * @param id 地图ID
     * @param postId 岗位ID
     * @return 返回当前用户学习地图等级
     */
    Integer queryTheCurrentUserLearningMapLevel(String id, String postId);

    /**
     * 根据岗位查看学习地图信息
     * @param userId 用户ID
     * @param postId 岗位ID
     * @param level 地图等级
     * @return 返回学习地图信息
     */
    List<FtbCultivateLearnMapInfoVO> viewLearningMapBasedOnPosition(String userId, String postId, Integer level);

    /**
     * 获取学习地图详情
     * @param id 地图ID
     * @return 返回学习地图详情
     */
    FtbCultivateStudyMemberVO getDetails(String id);

    /**
     * 人员选择岗位
     * @param creatMeMapInfoDTO 人员选择岗位信息
     */
    void correspondingPersonnelSelectPositions(FtbCultivateCreatMeMapInfoDTO creatMeMapInfoDTO);

    /**
     * 查询下属学习阶段
     * @param userId 上级用户ID
     * @param postId 岗位ID
     * @return 返回下属学习阶段信息
     */
    FtbCultivateUnderMemberInfo queryTheLearningStageOfSubordinates(String userId, String postId);

    /**
     * 根据阶段选择岗位
     * @param userId 用户ID
     * @param postId 岗位ID
     * @param level 地图等级
     * @param compulsory 是否必修
     * @return 返回可选岗位信息
     */
    FtbCultivateNextCourseVO selectPositionsCorrespondingToTheStages(String userId, String postId, Integer level, Integer compulsory);

    /**
     * 更改当前人学习阶段
     * @param userId 当前人
     * @param postId 完成岗位
     */
    void changeTheCurrentPersonSLearningStage(String userId,String postId);

    /**
     * 检查学习状态
     * @param level 学习等级
     * @param userId 用户ID
     * @param postId 岗位ID
     * @return 返回检查结果
     */
    String checkStudying(Integer level, String userId, String postId);
    /**
     * 内部检查学习状态
     * @param level 学习等级
     * @param userId 用户ID
     * @param postId 岗位ID
     * @param promotionId 地图id
     * @return 状态
     */
    String innerCheckStudying(Integer level, String userId, String postId,String promotionId);

    /**
     * 判断岗位学习地图是否变更
     * @param userId 用户ID
     * @param postId 岗位ID
     * @return 返回是否变更
     */
    Boolean whetherTheJobLearningMapHasChanged(String userId, String postId);

    /**
     * 查询培训数据
     * @param userId 用户ID
     * @param postId 岗位ID
     * @return 返回培训数据
     */
    FtbCultivatePromotionWithPersonelVO queryTrainData(String userId, String postId);

    /**
     * 验证岗位是否重新学习地图
     * @param postId 岗位ID
     * @return 返回是否需要重新学习
     */
    Boolean verifyingThePostWillRelearnTheMap(String postId);

    /**
     * 学习进度
     * @param userId 用户ID
     * @param postId 岗位ID
     * @return 返回学习进度信息
     */
    FtbCultivatelearningProgressVO learningProgress(String userId, String postId);
    /**
     * 根据用户id和当前岗位id获取已选择的岗位
     * @param userId
     * @param postId
     * @return postIds
     */
    List<String> currentPersonChoosesAllPosition(String userId, String postId);
    /**
     * 根据初始岗位 查询学习地图岗位集合
     * @param postId
     * @return postIds
     */
    List<String> queryByInitPostIdMapPostId( String postId);

    /**
     * 根据岗位id查询已经选择的人员
     * @param postId
     * @return userIds
     */
    List<String> querySelectedPersonnelBasedOnPositionID(List<String> postId);

    String deleteByPromotionId(String id);

    Page<WebCultivatePromotionListVo> webList(Page<WebCultivatePromotionListVo> page, FtbCultivatePromotionReq dto);

    List<BatchCommonCountDto> queryMaxLevel(List<String> promotionIds);

    Page<V2CultivatePromotionPersonStatisticVo> personStatisticsV2(V2PromotionPersonStatisticReq req, List<String> userIds, Page<V2CultivatePromotionPersonStatisticVo> page);

    List<CultivateUserPositionVo> queryPromotionPosition(List<String> userIds);

    Page<V2CultivatePromotionOrgStatisticVo> mapStatisticPageV2(Page<V2CultivatePromotionOrgStatisticVo> page, V2PromotionOrgStatisticReq req, List<String> userIds);

    List<BatchCommonCountDto> userCountForPromotion(List<String> userIds);

    List<BatchCommonCountDto> queryPositionNumForMap(List<String> promotionIds);
}
