using AdsManagerService.Domain.SeedWork;

namespace AdsManagerService.Domain.AggregatesModel.CampaignAggregate;

/// <summary>
/// EN: Repository interface for Campaign aggregate.
/// VI: Interface repository cho Campaign aggregate.
/// </summary>
public interface ICampaignRepository : IRepository<Campaign>
{
    /// <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);

    /// <summary>
    /// EN: Get campaign by ID.
    /// VI: Lấy chiến dịch theo ID.
    /// </summary>
    Task<Campaign?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get campaigns by advertiser ID.
    /// VI: Lấy danh sách chiến dịch theo ID nhà quảng cáo.
    /// </summary>
    Task<IEnumerable<Campaign>> GetByAdvertiserIdAsync(Guid advertiserId, CancellationToken cancellationToken = default);

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