using MktZaloService.Domain.SeedWork;

namespace MktZaloService.Domain.AggregatesModel.ConversationAggregate;

/// <summary>
/// EN: Repository interface for Conversation aggregate.
/// VI: Interface repository cho Conversation aggregate.
/// </summary>
public interface IConversationRepository : IRepository<Conversation>
{
    /// <summary>
    /// EN: Get conversation by ID with messages.
    /// VI: Lấy cuộc hội thoại theo ID kèm tin nhắn.
    /// </summary>
    Task<Conversation?> GetByIdAsync(Guid id, CancellationToken ct = default);

    /// <summary>
    /// EN: Get conversation by ID with paginated messages.
    /// VI: Lấy cuộc hội thoại theo ID với tin nhắn phân trang.
    /// </summary>
    Task<Conversation?> GetByIdWithMessagesAsync(
        Guid id,
        int skip = 0,
        int take = 50,
        CancellationToken ct = default);

    /// <summary>
    /// EN: Find active conversation by Zalo user ID.
    /// VI: Tìm cuộc hội thoại đang hoạt động theo Zalo user ID.
    /// </summary>
    Task<Conversation?> FindActiveByZaloUserIdAsync(
        string zaloUserId,
        CancellationToken ct = default);

    /// <summary>
    /// EN: Add a new conversation.
    /// VI: Thêm cuộc hội thoại mới.
    /// </summary>
    Conversation Add(Conversation conversation);

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