// EN: Strategy interface for line item processing.
// VI: Interface Strategy cho xử lý dòng hàng.

using OrderService.Domain.AggregatesModel.OrderAggregate;

namespace OrderService.Domain.Strategies;

/// <summary>
/// EN: Strategy interface for processing different product types.
/// VI: Interface Strategy cho xử lý các loại sản phẩm khác nhau.
/// </summary>
public interface ILineItemStrategy
{
    /// <summary>
    /// EN: Product type this strategy supports.
    /// VI: Loại sản phẩm mà strategy này hỗ trợ.
    /// </summary>
    string SupportedType { get; }

    /// <summary>
    /// EN: Validate if the item can be fulfilled.
    /// VI: Xác thực xem item có thể được thực hiện không.
    /// </summary>
    /// <param name="item">Order item to validate</param>
    /// <param name="shopId">Shop ID</param>
    /// <param name="cancellationToken">Cancellation token</param>
    /// <returns>True if item can be fulfilled</returns>
    Task<bool> ValidateAsync(OrderItem item, Guid shopId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Execute the item fulfillment.
    /// VI: Thực thi việc thực hiện item.
    /// </summary>
    /// <param name="item">Order item to execute</param>
    /// <param name="shopId">Shop ID</param>
    /// <param name="cancellationToken">Cancellation token</param>
    Task ExecuteAsync(OrderItem item, Guid shopId, CancellationToken cancellationToken = default);
}
