using Hua.Todo.Core.Entities;

namespace Hua.Todo.Application.CloudSync.Models;

/// <summary>
/// 云同步任务条目。
/// </summary>
public class CloudTaskItem
{
    /// <summary>
    /// 任务 ID（服务端分配）。
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 标题。
    /// </summary>
    public string Title { get; set; } = string.Empty;

    /// <summary>
    /// 优先级。
    /// </summary>
    public TaskPriority Priority { get; set; }

    /// <summary>
    /// 是否完成。
    /// </summary>
    public bool IsCompleted { get; set; }

    /// <summary>
    /// 创建时间（UTC）。
    /// </summary>
    public DateTime CreatedAtUtc { get; set; }

    /// <summary>
    /// 更新时间（UTC）。
    /// </summary>
    public DateTime UpdatedAtUtc { get; set; }

    /// <summary>
    /// 父任务 ID（v1.2.0 同步可先不使用）。
    /// </summary>
    public int? ParentTaskId { get; set; }
}

/// <summary>
/// 同步请求（增改删）。
/// </summary>
public class SyncRequest
{
    /// <summary>
    /// 新增或更新的任务列表。
    /// </summary>
    public List<CloudTaskUpsert> Upserts { get; set; } = new();

    /// <summary>
    /// 需要删除的任务 ID 列表。
    /// </summary>
    public List<int> Deletes { get; set; } = new();
}

/// <summary>
/// 任务 Upsert DTO。
/// </summary>
public class CloudTaskUpsert
{
    /// <summary>
    /// 任务 ID；为空表示新建。
    /// </summary>
    public int? Id { get; set; }

    /// <summary>
    /// 标题。
    /// </summary>
    public string Title { get; set; } = string.Empty;

    /// <summary>
    /// 优先级。
    /// </summary>
    public TaskPriority Priority { get; set; } = TaskPriority.Medium;

    /// <summary>
    /// 是否完成。
    /// </summary>
    public bool IsCompleted { get; set; }

    /// <summary>
    /// 父任务 ID（可选）。
    /// </summary>
    public int? ParentTaskId { get; set; }
}

/// <summary>
/// 同步响应。
/// </summary>
public class SyncResponse
{
    /// <summary>
    /// 服务端时间（UTC）。
    /// </summary>
    public DateTime ServerTimeUtc { get; set; }

    /// <summary>
    /// 当前用户的任务全量。
    /// </summary>
    public List<CloudTaskItem> Tasks { get; set; } = new();
}

