using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;

namespace TakeoutSaaS.Domain.Products.Entities;

/// <summary>
/// 商品 SKU 异步保存任务。
/// </summary>
public sealed class ProductSkuSaveJob : MultiTenantEntityBase
{
    /// <summary>
    /// 所属门店 ID。
    /// </summary>
    public long StoreId { get; set; }

    /// <summary>
    /// 所属商品 ID。
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 任务状态。
    /// </summary>
    public ProductSkuSaveJobStatus Status { get; set; } = ProductSkuSaveJobStatus.Queued;

    /// <summary>
    /// 任务模式（当前固定 replace）。
    /// </summary>
    public string Mode { get; set; } = "replace";

    /// <summary>
    /// 任务请求负载 JSON 快照。
    /// </summary>
    public string PayloadJson { get; set; } = string.Empty;

    /// <summary>
    /// 总处理数。
    /// </summary>
    public int ProgressTotal { get; set; }

    /// <summary>
    /// 已处理数。
    /// </summary>
    public int ProgressProcessed { get; set; }

    /// <summary>
    /// 失败条数。
    /// </summary>
    public int FailedCount { get; set; }

    /// <summary>
    /// 失败摘要。
    /// </summary>
    public string? ErrorMessage { get; set; }

    /// <summary>
    /// Hangfire 任务 ID。
    /// </summary>
    public string? HangfireJobId { get; set; }

    /// <summary>
    /// 开始执行时间（UTC）。
    /// </summary>
    public DateTime? StartedAt { get; set; }

    /// <summary>
    /// 完成时间（UTC）。
    /// </summary>
    public DateTime? FinishedAt { get; set; }
}
