using MktXService.Domain.SeedWork;

namespace MktXService.Domain.AggregatesModel.ConversationAggregate;

/// <summary>
/// EN: Repository interface for Conversation aggregate.
/// VI: Interface repository cho Conversation aggregate.
/// </summary>
public interface IConversationRepository : IRepository<Conversation>
{
    /// <summary>
    /// EN: Add a new conversation.
    /// VI: Thêm một hội thoại mới.
    /// </summary>
    Conversation Add(Conversation conversation);

    /// <summary>
    /// EN: Update an existing conversation.
    /// VI: Cập nhật một hội thoại hiện có.
    /// </summary>
    void Update(Conversation conversation);

    /// <summary>
    /// EN: Get conversation by ID.
    /// VI: Lấy hội thoại theo ID.
    /// </summary>
    Task<Conversation?> GetByIdAsync(Guid id);

    /// <summary>
    /// EN: Get conversation by ID with messages.
    /// VI: Lấy hội thoại theo ID kèm tin nhắn.
    /// </summary>
    Task<Conversation?> GetByIdWithMessagesAsync(Guid id);

    /// <summary>
    /// EN: Get open conversation for a contact.
    /// VI: Lấy hội thoại đang mở của một liên hệ.
    /// </summary>
    Task<Conversation?> GetOpenByContactIdAsync(Guid contactId);

    /// <summary>
    /// EN: Get conversations by account ID with pagination.
    /// VI: Lấy hội thoại theo account ID với phân trang.
    /// </summary>
    Task<IEnumerable<Conversation>> GetByAccountIdAsync(Guid accountId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get conversations by status.
    /// VI: Lấy hội thoại theo trạng thái.
    /// </summary>
    Task<IEnumerable<Conversation>> GetByStatusAsync(Guid accountId, ConversationStatus status, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get conversations assigned to a user.
    /// VI: Lấy hội thoại được gán cho một người dùng.
    /// </summary>
    Task<IEnumerable<Conversation>> GetByAssignedUserAsync(Guid userId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Count open conversations for an account.
    /// VI: Đếm hội thoại đang mở của một account.
    /// </summary>
    Task<int> CountOpenByAccountIdAsync(Guid accountId);
}
