using Hua.Todo.Core.Entities;

namespace Hua.Todo.Core.Interfaces;

/// <summary>
/// 任务仓储接口，定义任务数据访问操作
/// </summary>
public interface ITaskRepository
{
    /// <summary>
    /// 获取所有任务
    /// </summary>
    /// <returns>包含所有任务实体的列表任务</returns>
    System.Threading.Tasks.Task<List<TaskEntity>> GetAllAsync();
    
    /// <summary>
    /// 根据ID获取指定任务
    /// </summary>
    /// <param name="id">任务唯一标识符</param>
    /// <returns>任务实体对象，如果不存在则返回 null 的任务</returns>
    System.Threading.Tasks.Task<TaskEntity?> GetByIdAsync(int id);
    
    /// <summary>
    /// 获取所有未完成的任务
    /// </summary>
    /// <returns>未完成任务实体的列表任务</returns>
    System.Threading.Tasks.Task<List<TaskEntity>> GetActiveTasksAsync();
    
    /// <summary>
    /// 获取所有已完成的任务
    /// </summary>
    /// <returns>已完成任务实体的列表任务</returns>
    System.Threading.Tasks.Task<List<TaskEntity>> GetCompletedTasksAsync();
    
    /// <summary>
    /// 添加新任务
    /// </summary>
    /// <param name="taskEntity">要添加的任务实体对象</param>
    /// <returns>添加后的任务实体（包含生成的 ID）的任务</returns>
    System.Threading.Tasks.Task<TaskEntity> AddAsync(TaskEntity taskEntity);
    
    /// <summary>
    /// 更新任务
    /// </summary>
    /// <param name="taskEntity">要更新的任务实体对象</param>
    /// <returns>更新后的任务实体对象的任务</returns>
    System.Threading.Tasks.Task<TaskEntity> UpdateAsync(TaskEntity taskEntity);
    
    /// <summary>
    /// 删除指定ID的任务
    /// </summary>
    /// <param name="id">要删除的任务唯一标识符</param>
    /// <returns>表示删除操作的任务</returns>
    System.Threading.Tasks.Task DeleteAsync(int id);
    
    /// <summary>
    /// 获取指定父任务的所有子任务
    /// </summary>
    /// <param name="parentTaskId">父任务唯一标识符</param>
    /// <returns>子任务实体的列表任务</returns>
    System.Threading.Tasks.Task<List<TaskEntity>> GetSubTasksAsync(int parentTaskId);
}
