package org.xyzh.api.study.task;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.study.TbLearningTask;
import org.xyzh.common.dto.study.TbTaskUser;
import org.xyzh.common.vo.TaskItemVO;
import org.xyzh.common.vo.TaskVO;
import org.xyzh.common.dto.study.TbTaskItem;

import java.util.List;

/**
 * @description 学习任务服务接口
 * @filename LearningTaskService.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
public interface LearningTaskService {

    /**
     * @description 获取学习任务列表
     * @param filter 过滤条件
     * @return ResultDomain<TbLearningTask> 任务列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbLearningTask> getTaskList(TbLearningTask filter);

    /**
     * @description 获取学习任务列表分页
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<TbLearningTask> 任务列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbLearningTask> getTaskPage(TbLearningTask filter, PageParam pageParam);

    /**
     * @description 根据ID获取任务详情
     * @param taskID 任务ID
     * @return ResultDomain<TbLearningTask> 任务详情
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TaskVO> getTaskById(String taskID);

    /**
     * @description 根据ID获取任务用户详情
     * @param taskID 任务ID
     * @return ResultDomain<TaskItemVO> 任务用户详情
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TaskVO> getTaskUser(String taskID);

    /**
     * @description 创建学习任务
     * @param task 任务信息
     * @return ResultDomain<TbLearningTask> 创建结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TaskVO> createTask(TaskVO taskVO);

    /**
     * @description 更新学习任务
     * @param task 任务信息
     * @return ResultDomain<TbLearningTask> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TaskVO> updateTask(TaskVO taskVO);

    /**
     * @description 删除学习任务
     * @param taskID 任务ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> deleteTask(String taskID);

    /**
     * @description 更新任务状态
     * @param taskID 任务ID
     * @param status 状态
     * @return ResultDomain<TbLearningTask> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbLearningTask> updateTaskStatus(String taskID, Integer status);

    // ----------------任务用户相关--------------------------------

    ResultDomain<TbLearningTask> getUserTaskPage(TaskItemVO filter, PageParam pageParam);

    /**
     * @description 获取任务用户列表
     * @param taskID 任务ID
     * @return ResultDomain<TbTaskUser> 用户列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TaskItemVO> getTaskUsers(String taskID);

    /**
     * @description 添加任务用户
     * @param taskUser 任务用户信息
     * @return ResultDomain<TbTaskUser> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskUser> addTaskUser(String taskID, List<String> userIDs);

    /**
     * @description 批量添加任务用户
     * @param taskID 任务ID
     * @param userIDs 用户ID列表
     * @param deptID 部门ID
     * @return ResultDomain<TbTaskUser> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskUser> batchAddTaskUsers(String taskID, List<String> userIDs, String deptID);

    /**
     * @description 移除任务用户
     * @param taskID 任务ID
     * @param userID 用户ID
     * @return ResultDomain<Boolean> 移除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> removeTaskUser(String taskID, List<String> userIDs);

    /**
     * @description 更新任务用户状态
     * @param taskID 任务ID
     * @param userID 用户ID
     * @param status 状态
     * @param progress 进度
     * @return ResultDomain<TbTaskUser> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskUser> updateTaskUserStatus(String taskID, String userID, Integer status, java.math.BigDecimal progress);

    /**
     * @description 获取用户整体学习进度
     * @param userID 用户ID
     * @return ResultDomain<TaskVO> 学习进度
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TaskVO> getUserProgress(String userID);

    // ----------------任务课程相关--------------------------------

    /**
     * @description 获取任务课程列表
     * @param taskID 任务ID
     * @return ResultDomain<TbTaskItem> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskItem> getTaskCourses(String taskID);

    /**
     * @description 添加任务课程
     * @param taskItem 任务项信息
     * @return ResultDomain<TbTaskItem> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskItem> addTaskCourse(TbTaskItem taskItem);

    /**
     * @description 移除任务课程
     * @param taskID 任务ID
     * @param courseID 课程ID
     * @return ResultDomain<Boolean> 移除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> removeTaskCourse(String taskID, String courseID);

    // ----------------任务资源相关--------------------------------

    /**
     * @description 获取任务资源列表
     * @param taskID 任务ID
     * @return ResultDomain<TbTaskItem> 资源列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskItem> getTaskResources(String taskID);

    /**
     * @description 添加任务资源
     * @param taskItem 任务项信息
     * @return ResultDomain<TbTaskItem> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTaskItem> addTaskResource(TbTaskItem taskItem);

    /**
     * @description 移除任务资源
     * @param taskID 任务ID
     * @param resourceID 资源ID
     * @return ResultDomain<Boolean> 移除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> removeTaskResource(String taskID, String resourceID);
}
