using IamService.Domain.SeedWork;

namespace IamService.Domain.AggregatesModel.GroupAggregate;

/// <summary>
/// EN: Interface for Group repository.
/// VI: Interface cho repository Group.
/// </summary>
public interface IGroupRepository : IRepository<Group>
{
    /// <summary>
    /// EN: Get group by ID with members and permissions.
    /// VI: Lấy nhóm theo ID với thành viên và quyền.
    /// </summary>
    Task<Group?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get group by ID with members loaded.
    /// VI: Lấy nhóm theo ID với thành viên được load.
    /// </summary>
    Task<Group?> GetByIdWithMembersAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get all groups for an organization.
    /// VI: Lấy tất cả nhóm của một tổ chức.
    /// </summary>
    Task<IEnumerable<Group>> GetByOrganizationIdAsync(Guid organizationId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get all groups a user is a member of.
    /// VI: Lấy tất cả nhóm mà user là thành viên.
    /// </summary>
    Task<IEnumerable<Group>> GetByUserIdAsync(Guid userId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Check if a user is a member of a group.
    /// VI: Kiểm tra user có phải là thành viên của nhóm không.
    /// </summary>
    Task<bool> IsUserMemberAsync(Guid groupId, Guid userId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Add a new group.
    /// VI: Thêm nhóm mới.
    /// </summary>
    Group Add(Group group);

    /// <summary>
    /// EN: Update an existing group.
    /// VI: Cập nhật nhóm hiện có.
    /// </summary>
    void Update(Group group);

    /// <summary>
    /// EN: Delete a group.
    /// VI: Xóa nhóm.
    /// </summary>
    void Delete(Group group);
}
