using MiningService.Domain.SeedWork;

namespace MiningService.Domain.AggregatesModel.ReferralAggregate;

/// <summary>
/// EN: Repository interface for Referral aggregate.
/// VI: Interface repository cho Referral aggregate.
/// </summary>
public interface IReferralRepository : IRepository<Referral>
{
    /// <summary>
    /// EN: Get referral by ID.
    /// VI: Lấy giới thiệu theo ID.
    /// </summary>
    Task<Referral?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get all referrals made by a miner.
    /// VI: Lấy tất cả giới thiệu bởi một thợ đào.
    /// </summary>
    Task<List<Referral>> GetByReferrerIdAsync(Guid referrerId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get active referrals count for a miner.
    /// VI: Lấy số lượng giới thiệu hoạt động của thợ đào.
    /// </summary>
    Task<int> GetActiveCountByReferrerIdAsync(Guid referrerId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get referral by referred miner ID.
    /// VI: Lấy giới thiệu theo ID thợ đào được giới thiệu.
    /// </summary>
    Task<Referral?> GetByReferredIdAsync(Guid referredId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Add new referral.
    /// VI: Thêm giới thiệu mới.
    /// </summary>
    Referral Add(Referral referral);

    /// <summary>
    /// EN: Update existing referral.
    /// VI: Cập nhật giới thiệu hiện có.
    /// </summary>
    void Update(Referral referral);
}
