package jnpf.cultivate.v2.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.base.vo.PageListVO;
import jnpf.model.cultivate.CultivatePage;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionMemberNew;
import jnpf.model.cultivate.po.promotion.FtbCultivatePromotionPostNew;
import jnpf.model.cultivate.v2.promotion.req.*;
import jnpf.model.cultivate.v2.promotion.vo.*;

import java.util.List;
import java.util.Map;


public interface V2CultivatePromotionService {

    /**
     * web查询学习地图列表
     *
     * @param page 分页查询参数对象，包含分页信息如页码、每页大小等
     * @param dto  包含查询条件和筛选参数
     * @return PageListVO<WebCultivatePromotionListVo> 分页结果对象，
     *         包含网页培育推广列表数据和分页相关信息
     */
    PageListVO<WebCultivatePromotionListVo> webList(CultivatePage page, FtbCultivatePromotionReq dto);

    /**
     * 新增学习地图
     *
     * @param creatDto 新增参数对象，包含新增信息
     * @return String 新增结果信息，如成功返回"新增成功"，失败返回错误信息
     */
    String add(V2CultivatePromotionCreateReq creatDto);

    /**
     * 修改学习地图
     *
     * @param creatDto 修改参数对象，包含修改信息
     * @return String 修改结果信息，如成功返回"修改成功"，失败返回错误信息
     */
    String update(V2CultivatePromotionCreateReq creatDto);

    /**
     * 删除学习地图
     *
     * @param id 学习地图id
     * @return String 删除结果信息，如成功返回"删除成功"，失败返回错误信息
     */
    void delete(String id);

    /**
     * 根据ID获取学习地图信息
     *
     * @param id 学习地图id
     * @return V2CultivatePromotionVo 查询结果对象，包含学习地图信息
     */
    V2CultivatePromotionVo get(String id);

    /**
     * 根据地图主键id 获取地图成员信息
     *
     * @param req 请求参数对象，包含查询条件
     * @param page 分页查询参数对象，包含分页信息如页码、每页大小等
     * @return V2WebCultivateStudyMemberListVo 获取结果对象，包含学习地图成员信息
     */
    V2WebCultivateStudyMemberListVo queryPromotionUserList(V2WebCultivateStudyMemberListReq req, CultivatePage page);

    /**
     * 查询在岗位学习中完成的配置的岗位&职级
     *
     * @param req 请求参数对象，包含排除条件
     * @return List<V2CultivatePositionVo> 查询结果列表，包含岗位&职级信息
     */
    List<V2CultivatePositionVo> queryCultivatePosition(V2CultivatePositionExcludeReq req);

    /**
     * 获取我的所有学习地图列表
     *
     * @param userId 用户ID
     * @return List<MyCultivatePromotionListVo> 查询结果列表，包含用户的学习地图信息
     */
    List<MyCultivatePromotionListVo> queryMyAllPromotionList(String userId);

    /**
     * 获取学习地图阶段信息（userId+promotionId+level）
     *
     * @param userId      用户id
     * @param promotionId 学习地图id
     * @param level       阶段
     * @return PromotionPhaseVo 查询结果对象，包含学习地图阶段信息
     */
    PromotionPhaseVo queryPromotionInfoForLevel(String userId, String promotionId, Integer level);

    /**
     * 添加成员到学习地图
     *
     * @param id        学习地图id
     * @param creatDto  成员信息参数对象，包含新增成员的信息
     */
    void addMemberToPromotion(String id, V2CultivatePromotionCreateReq creatDto);

    /**
     * 选定一个学习地图
     *
     * @param userId      用户id
     * @param promotionId 学习地图id
     */
    void selectPromotion(String userId, String promotionId);

    /**
     * 学习地图的一个阶段，选定学习的岗位
     *
     * @param req 请求参数对象，包含岗位选择信息
     */
    void recordSelectPosition(V2CultivatePromotionSelectPositionReq req);

    /**
     * 获取岗位学习详情
     *
     * @param req 请求参数对象，包含查询条件
     * @return AppCultivatePromotionPositionDetailVo 岗位学习详情对象
     */
    AppCultivatePromotionPositionDetailVo getPositionStudyDetail(V2CultivatePromotionPositionDetailForApp req);

    /**
     * 获取岗位学习详情
     *
     * @param req 岗位学习详情请求参数对象
     * @return Integer 岗位学习状态码
     */
    Integer promotionLevelStatus(V2CultivatePromotionPhaseStateForApp req);

    /**
     * 修改学习地图状态为错误
     *
     * @param list 学习地图id列表
     */
    void updatePromotionError(List<FtbCultivatePromotionPostNew> list);

    /**
     * 个人维度统计
     *
     * @param req 请求参数对象，包含统计条件
     * @return PageListVO<V2CultivatePromotionPersonStatisticVo> 统计结果分页对象
     */
    PageListVO<V2CultivatePromotionPersonStatisticVo> personStatistics(V2PromotionPersonStatisticReq req);

    /**
     * 组织维度统计
     *
     * @param req 请求参数对象，包含统计条件
     * @return PageListVO<V2CultivatePromotionOrgStatisticVo> 统计结果分页对象
     */
    Page<V2CultivatePromotionOrgStatisticVo> organizationStatistics(V2PromotionOrgStatisticReq req);

    Map<String, List<V2CultivatePostAndGradeVo>> queryAllSelectPosition(String userId, List<String> promotionIds);

    /**
     * 根据用户ID和学习地图ID查询指定学习地图及分阶段岗位信息
     *
     * @param userId      用户ID
     * @param promotionId 学习地图ID
     * @return UserPromotionDetailVo 用户学习地图详情，包含该学习地图的各阶段岗位信息
     */
    UserPromotionDetailVo getUserPromotionDetail(String userId, String promotionId);
}
