namespace PromotionService.Domain.AggregatesModel.CampaignAggregate;

using PromotionService.Domain.SeedWork;

/// <summary>
/// EN: Repository interface for Campaign aggregate.
/// VI: Interface repository cho Campaign aggregate.
/// </summary>
public interface ICampaignRepository : IRepository<Campaign>
{
    /// <summary>
    /// EN: Get campaign by ID with vouchers.
    /// VI: Lấy chiến dịch theo ID với voucher.
    /// </summary>
    Task<Campaign?> GetByIdAsync(Guid id);

    /// <summary>
    /// EN: Get campaigns by merchant ID.
    /// VI: Lấy chiến dịch theo ID merchant.
    /// </summary>
    Task<IEnumerable<Campaign>> GetByMerchantIdAsync(Guid merchantId);

    /// <summary>
    /// EN: Get active campaigns.
    /// VI: Lấy các chiến dịch đang hoạt động.
    /// </summary>
    Task<IEnumerable<Campaign>> GetActiveAsync();

    /// <summary>
    /// EN: Get voucher by code across all campaigns.
    /// VI: Lấy voucher theo mã trên tất cả chiến dịch.
    /// </summary>
    Task<Voucher?> GetVoucherByCodeAsync(string code);

    /// <summary>
    /// EN: Get vouchers owned by a user.
    /// VI: Lấy voucher thuộc về người dùng.
    /// </summary>
    Task<IEnumerable<Voucher>> GetUserVouchersAsync(Guid userId);

    /// <summary>
    /// EN: Get voucher by ID.
    /// VI: Lấy voucher theo ID.
    /// </summary>
    Task<Voucher?> GetVoucherByIdAsync(Guid voucherId);

    /// <summary>
    /// EN: Add a new campaign.
    /// VI: Thêm chiến dịch mới.
    /// </summary>
    Campaign Add(Campaign campaign);

    /// <summary>
    /// EN: Update an existing campaign.
    /// VI: Cập nhật chiến dịch hiện có.
    /// </summary>
    void Update(Campaign campaign);
}
