using MiningService.Domain.SeedWork;

namespace MiningService.Domain.AggregatesModel.MinerAggregate;

/// <summary>
/// EN: Repository interface for Miner aggregate.
/// VI: Interface repository cho Miner aggregate.
/// </summary>
public interface IMinerRepository : IRepository<Miner>
{
    /// <summary>
    /// EN: Get miner by ID with mining histories.
    /// VI: Lấy thợ đào theo ID với lịch sử đào.
    /// </summary>
    Task<Miner?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get miner by user ID.
    /// VI: Lấy thợ đào theo user ID.
    /// </summary>
    Task<Miner?> GetByUserIdAsync(Guid userId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get miner by referral code.
    /// VI: Lấy thợ đào theo mã giới thiệu.
    /// </summary>
    Task<Miner?> GetByReferralCodeAsync(string referralCode, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get top miners by total points.
    /// VI: Lấy thợ đào hàng đầu theo tổng điểm.
    /// </summary>
    Task<List<Miner>> GetTopMinersAsync(int limit, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Add new miner.
    /// VI: Thêm thợ đào mới.
    /// </summary>
    Miner Add(Miner miner);

    /// <summary>
    /// EN: Update existing miner.
    /// VI: Cập nhật thợ đào hiện có.
    /// </summary>
    void Update(Miner miner);

    /// <summary>
    /// EN: Check if referral code exists.
    /// VI: Kiểm tra mã giới thiệu đã tồn tại chưa.
    /// </summary>
    Task<bool> ReferralCodeExistsAsync(string referralCode, 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> GetActiveReferralsCountAsync(Guid minerId, CancellationToken cancellationToken = default);
}
