package jnpf.cultivate.v2.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageInfo;
import jnpf.base.vo.PageListVO;
import jnpf.model.cultivate.CultivatePage;
import jnpf.model.cultivate.dto.learn.FtbCultivateLearnAllocationDTO;
import jnpf.model.cultivate.v2.position.req.V2CultivateCoursePageReq;
import jnpf.model.cultivate.v2.position.vo.V2CultivateJobLearnCourseVo;
import jnpf.model.cultivate.v2.task.req.V2CultivateLearnTaskListForManagerReq;
import jnpf.model.cultivate.v2.task.req.V2CultivateTaskCountReq;
import jnpf.model.cultivate.v2.task.req.V2CultivateTaskSaveReq;
import jnpf.model.cultivate.v2.task.req.V2MyCultivateTaskListForReq;
import jnpf.model.cultivate.v2.task.vo.*;

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


public interface V2CultivateTaskService {


    /**
     * 添加学习任务
     *
     * @param req 添加学习任务所需的参数
     * @return 添加成功后的任务ID
     */
    String add(V2CultivateTaskSaveReq req);

    /**
     * 更新学习任务
     *
     * @param req 更新学习任务所需的参数
     * @return 更新成功后的任务ID
     */
    String update(V2CultivateTaskSaveReq req);

    /**
     * 分配任务
     *
     * @param allocationDTO 分配数据传输对象，包含分配培养学习所需的各项数据
     */
    void allocation(FtbCultivateLearnAllocationDTO allocationDTO);

    /**
     * 中止指定任务
     *
     * @param taskId 任务ID，用于标识需要中止的任务
     */
    void abort(String taskId);

    /**
     * 删除指定ID的任务
     *
     * @param id 任务的唯一标识符
     */
    void deleteTask(String id);

    /**
     * 获取指定ID的任务详情
     *
     * @param id 任务的唯一标识符
     * @return 任务详情
     */
    V2CultivateTaskDetailsVo get(String id);


    /**
     * app任务管理查询任务列表
     *
     * @return 任务列表
     */
    PageListVO<V2CultivateTaskListForManagerVo> queryTaskListForApp(V2CultivateLearnTaskListForManagerReq req);

    /**
     * app任务管理查询任务列表小气泡数
     *
     * @return 任务列表小气泡数
     */
    Map<String, Integer> queryTaskCountForApp(String keyWord);

    /**
     * app任务管理-任务完成统计
     *
     * @param taskId 任务ID
     * @return 任务完成统计信息
     */
    V2CultivateLearnTaskFinishStatisticsVo getCompletionStatisticsForManagerApp(String taskId);

    /**
     * app任务管理-人员完成情况列表
     *
     * @param taskId 任务id
     * @return 人员列表
     */
    PageListVO<V2CultivateTaskFinishUserListVo> queryTaskUserListForManagerApp(String taskId, CultivatePage page);

    /**
     * app我的任务列表
     *
     * @return 我的任务列表
     */
    PageListVO<V2MyCultivateLearnTaskListVo> queryMyTaskListForApp(V2MyCultivateTaskListForReq req);

    /**
     * app我的任务列表计数
     *
     * @return 我的任务列表计数
     */
    Map<String, Integer> queryMyTaskCountForApp(String keyWord);


    /**
     * 开始任务
     *
     * @param myTaskId 我的任务id
     * @param userId   用户id
     */
    void startTask(String myTaskId, String userId);

    /**
     * 定时检查任务状态(接定时任务)
     *
     * @param tenantId 租户id
     */
    void checkAndUpdateTaskStatus(String tenantId);

    /**
     * app我的任务列表-任务简单信息
     *
     * @param myTaskId 我的任务
     * @return 任务简单信息
     */
    V2MyCultivateLearnTaskSimpleInfoVo queryMyTaskSimpleInfoForApp(String myTaskId);

    /**
     * app我的任务详情-阶段详情
     *
     * @param myTaskId 我的任务id
     * @param phase    阶段ID
     * @return 阶段详情
     */
    V2CultivateLearnTaskPhaseVo queryMyTaskPhaseInfoForApp(String myTaskId, String phase);


    Page<V2CultivateJobLearnCourseVo> positionCourseList(V2CultivateCoursePageReq req);

    List<V2CultivateLearnTaskPhaseVo> queryUserTaskInfo(String myTaskId);

    /**
     * 检查考试是否被学习任务绑定
     *
     * @param examId 考试ID
     * @return true-已绑定 false-未绑定
     */
    Boolean checkExamBinding(String examId);

    /**
     * 检查用户任务所有阶段是否完成
     *
     * @param userTaskId 用户任务ID（我的任务ID）
     * @return 用户任务所有阶段完成状态
     */
    CheckUserTaskAllPhasesCompleteVo checkUserTaskAllPhasesComplete(String userTaskId);
}
