using MiningService.Domain.SeedWork;

namespace MiningService.Domain.AggregatesModel.CircleAggregate;

/// <summary>
/// EN: Repository interface for Circle aggregate.
/// VI: Interface repository cho Circle aggregate.
/// </summary>
public interface ICircleRepository : IRepository<Circle>
{
    /// <summary>
    /// EN: Get circle by ID with members.
    /// VI: Lấy vòng tròn theo ID với thành viên.
    /// </summary>
    Task<Circle?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get circle by owner ID.
    /// VI: Lấy vòng tròn theo ID chủ sở hữu.
    /// </summary>
    Task<Circle?> GetByOwnerIdAsync(Guid ownerId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get circle that a miner is member of.
    /// VI: Lấy vòng tròn mà thợ đào là thành viên.
    /// </summary>
    Task<Circle?> GetByMemberIdAsync(Guid minerId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Add new circle.
    /// VI: Thêm vòng tròn mới.
    /// </summary>
    Circle Add(Circle circle);

    /// <summary>
    /// EN: Update existing circle.
    /// VI: Cập nhật vòng tròn hiện có.
    /// </summary>
    void Update(Circle circle);
}
