namespace CMSMicroservice.Application.ProductsCQ.Commands.BulkUpdateProductStock;

/// <summary>
/// به‌روزرسانی دسته‌ای موجودی محصولات
/// </summary>
public record BulkUpdateProductStockCommand : IRequest<BulkUpdateProductStockResponseDto>
{
    /// <summary>
    /// لیست محصولات و موجودی‌های جدید
    /// </summary>
    public List<ProductStockUpdate> Products { get; init; } = new();
    
    /// <summary>
    /// نوع به‌روزرسانی
    /// </summary>
    public StockUpdateType UpdateType { get; init; } = StockUpdateType.Set;
}

/// <summary>
/// نوع به‌روزرسانی موجودی
/// </summary>
public enum StockUpdateType
{
    /// <summary>
    /// تنظیم مقدار مطلق
    /// </summary>
    Set = 1,
    
    /// <summary>
    /// اضافه کردن به موجودی فعلی
    /// </summary>
    Add = 2,
    
    /// <summary>
    /// کم کردن از موجودی فعلی
    /// </summary>
    Subtract = 3
}

/// <summary>
/// مدل به‌روزرسانی موجودی یک محصول
/// </summary>
public class ProductStockUpdate
{
    /// <summary>
    /// شناسه محصول
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// مقدار جدید/تغییر موجودی
    /// </summary>
    public int Quantity { get; set; }
}

/// <summary>
/// پاسخ به‌روزرسانی دسته‌ای موجودی
/// </summary>
public class BulkUpdateProductStockResponseDto
{
    /// <summary>
    /// تعداد محصولات به‌روزرسانی شده
    /// </summary>
    public int UpdatedCount { get; set; }

    /// <summary>
    /// تعداد محصولات ناموفق
    /// </summary>
    public int FailedCount { get; set; }

    /// <summary>
    /// جزئیات خطاها
    /// </summary>
    public List<string> Errors { get; set; } = new();

    /// <summary>
    /// آیا همه موفق بودند
    /// </summary>
    public bool IsSuccess => FailedCount == 0;
}
