using Hua.Todo.Core.Entities;
using System.Text.Json.Serialization;

namespace Hua.Todo.Application.Models;

/// <summary>
/// 创建任务请求 DTO。
/// </summary>
public class CreateTaskDto
{
    /// <summary>
    /// 任务标题。
    /// </summary>
    public string Title { get; set; } = string.Empty;

    [JsonConverter(typeof(JsonStringEnumConverter))]
    /// <summary>
    /// 任务优先级。
    /// </summary>
    public TaskPriority Priority { get; set; } = TaskPriority.Medium;

    /// <summary>
    /// 父任务 ID（用于创建子任务）。
    /// </summary>
    public int? ParentTaskId { get; set; }
}

/// <summary>
/// 更新任务请求 DTO。
/// </summary>
public class UpdateTaskDto
{
    /// <summary>
    /// 任务 ID。
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 新标题（可选）。
    /// </summary>
    public string? Title { get; set; }

    [JsonConverter(typeof(JsonStringEnumConverter))]
    /// <summary>
    /// 新优先级（可选）。
    /// </summary>
    public TaskPriority? Priority { get; set; }
}

/// <summary>
/// 任务返回 DTO。
/// </summary>
public class TaskDto
{
    /// <summary>
    /// 任务 ID。
    /// </summary>
    public int Id { get; set; }
    /// <summary>
    /// 任务标题。
    /// </summary>
    public string Title { get; set; } = string.Empty;

    [JsonConverter(typeof(JsonStringEnumConverter))]
    /// <summary>
    /// 任务优先级。
    /// </summary>
    public TaskPriority Priority { get; set; }

    /// <summary>
    /// 是否已完成。
    /// </summary>
    public bool IsCompleted { get; set; }
    /// <summary>
    /// 创建时间（UTC）。
    /// </summary>
    public DateTime CreatedAt { get; set; }
    /// <summary>
    /// 更新时间（UTC）。
    /// </summary>
    public DateTime UpdatedAt { get; set; }
    /// <summary>
    /// 父任务 ID（可选）。
    /// </summary>
    public int? ParentTaskId { get; set; }
    /// <summary>
    /// 子任务列表。
    /// </summary>
    public List<TaskDto> SubTasks { get; set; } = new();
}

/// <summary>
/// 通用 API 响应包装。
/// </summary>
/// <typeparam name="T">数据类型。</typeparam>
public class ApiResponse<T>
{
    /// <summary>
    /// 是否成功。
    /// </summary>
    public bool Success { get; set; }
    /// <summary>
    /// 返回数据（可选）。
    /// </summary>
    public T? Data { get; set; }
    /// <summary>
    /// 提示信息。
    /// </summary>
    public string Message { get; set; } = string.Empty;
    /// <summary>
    /// 错误列表。
    /// </summary>
    public List<string> Errors { get; set; } = new();
}
