using SocialService.Domain.SeedWork;

namespace SocialService.Domain.AggregatesModel.RelationshipAggregate;

/// <summary>
/// EN: Repository interface for Relationship aggregate.
/// VI: Interface repository cho Relationship aggregate.
/// </summary>
public interface IRelationshipRepository : IRepository<Relationship>
{
    /// <summary>
    /// EN: Add a new relationship.
    /// VI: Thêm một quan hệ mới.
    /// </summary>
    Relationship Add(Relationship relationship);

    /// <summary>
    /// EN: Update an existing relationship.
    /// VI: Cập nhật một quan hệ đã tồn tại.
    /// </summary>
    Relationship Update(Relationship relationship);

    /// <summary>
    /// EN: Get relationship by ID.
    /// VI: Lấy quan hệ theo ID.
    /// </summary>
    Task<Relationship?> GetByIdAsync(Guid id);

    /// <summary>
    /// EN: Get relationship between two users of a specific type.
    /// VI: Lấy quan hệ giữa hai users theo loại cụ thể.
    /// </summary>
    Task<Relationship?> GetByUsersAndTypeAsync(Guid requesterId, Guid addresseeId, RelationshipType type);

    /// <summary>
    /// EN: Get all friends of a user (accepted friendships).
    /// VI: Lấy tất cả bạn bè của user (kết bạn đã chấp nhận).
    /// </summary>
    Task<IEnumerable<Relationship>> GetFriendsAsync(Guid userId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get all followers of a user.
    /// VI: Lấy tất cả followers của user.
    /// </summary>
    Task<IEnumerable<Relationship>> GetFollowersAsync(Guid userId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get all users that a user is following.
    /// VI: Lấy tất cả users mà user đang theo dõi.
    /// </summary>
    Task<IEnumerable<Relationship>> GetFollowingAsync(Guid userId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get pending friend requests received by a user.
    /// VI: Lấy các yêu cầu kết bạn đang chờ mà user nhận được.
    /// </summary>
    Task<IEnumerable<Relationship>> GetPendingRequestsReceivedAsync(Guid userId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get pending friend requests sent by a user.
    /// VI: Lấy các yêu cầu kết bạn đang chờ mà user đã gửi.
    /// </summary>
    Task<IEnumerable<Relationship>> GetPendingRequestsSentAsync(Guid userId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Check if two users are friends.
    /// VI: Kiểm tra hai users có phải bạn bè không.
    /// </summary>
    Task<bool> AreFriendsAsync(Guid userId1, Guid userId2);

    /// <summary>
    /// EN: Check if a user is following another user.
    /// VI: Kiểm tra user có đang theo dõi user khác không.
    /// </summary>
    Task<bool> IsFollowingAsync(Guid followerId, Guid followeeId);

    /// <summary>
    /// EN: Get count of friends for a user.
    /// VI: Lấy số lượng bạn bè của user.
    /// </summary>
    Task<int> GetFriendsCountAsync(Guid userId);

    /// <summary>
    /// EN: Get count of followers for a user.
    /// VI: Lấy số lượng followers của user.
    /// </summary>
    Task<int> GetFollowersCountAsync(Guid userId);

    /// <summary>
    /// EN: Get count of following for a user.
    /// VI: Lấy số lượng following của user.
    /// </summary>
    Task<int> GetFollowingCountAsync(Guid userId);

    #region Admin Methods

    /// <summary>
    /// EN: Get all relationships with pagination and filtering (admin).
    /// VI: Lấy tất cả relationships với phân trang và filter (admin).
    /// </summary>
    Task<IEnumerable<Relationship>> GetAllAsync(int skip, int take, int? statusId = null, int? typeId = null);

    /// <summary>
    /// EN: Get total count of relationships with optional filters (admin).
    /// VI: Lấy tổng số relationships với filter tùy chọn (admin).
    /// </summary>
    Task<int> GetTotalCountAsync(int? statusId = null, int? typeId = null);

    /// <summary>
    /// EN: Delete a relationship (admin).
    /// VI: Xóa relationship (admin).
    /// </summary>
    void Delete(Relationship relationship);

    #endregion
}

