namespace PromotionService.Domain.AggregatesModel.RedemptionAggregate;

using PromotionService.Domain.SeedWork;

/// <summary>
/// EN: Repository interface for Redemption aggregate.
/// VI: Interface repository cho Redemption aggregate.
/// </summary>
public interface IRedemptionRepository : IRepository<Redemption>
{
    /// <summary>
    /// EN: Get redemptions by voucher ID.
    /// VI: Lấy các lần sử dụng theo ID voucher.
    /// </summary>
    Task<IEnumerable<Redemption>> GetByVoucherIdAsync(Guid voucherId);

    /// <summary>
    /// EN: Get redemptions by user ID.
    /// VI: Lấy các lần sử dụng theo ID người dùng.
    /// </summary>
    Task<IEnumerable<Redemption>> GetByUserIdAsync(Guid userId);

    /// <summary>
    /// EN: Get redemptions by campaign ID.
    /// VI: Lấy các lần sử dụng theo ID chiến dịch.
    /// </summary>
    Task<IEnumerable<Redemption>> GetByCampaignIdAsync(Guid campaignId);

    /// <summary>
    /// EN: Add a new redemption.
    /// VI: Thêm lần sử dụng mới.
    /// </summary>
    Redemption Add(Redemption redemption);
}
