namespace ChatService.Domain.Contracts;

/// <summary>
/// EN: Strongly-typed SignalR client interface for type-safe hub method calls.
/// VI: Interface SignalR client với strongly-typed cho việc gọi hub methods an toàn về kiểu.
/// </summary>
public interface IChatHubClient
{
    /// <summary>
    /// EN: Receive a new message in a conversation.
    /// VI: Nhận tin nhắn mới trong cuộc hội thoại.
    /// </summary>
    Task ReceiveMessage(MessageNotification message);

    /// <summary>
    /// EN: Notification when a user joins a room.
    /// VI: Thông báo khi user tham gia phòng.
    /// </summary>
    Task UserJoined(string userId, string userName, Guid roomId);

    /// <summary>
    /// EN: Notification when a user leaves a room.
    /// VI: Thông báo khi user rời phòng.
    /// </summary>
    Task UserLeft(string userId, Guid roomId);

    /// <summary>
    /// EN: Receive a chunk of AI streaming response.
    /// VI: Nhận một phần của AI streaming response.
    /// </summary>
    Task ReceiveAIChunk(string chunk, Guid messageId);

    /// <summary>
    /// EN: Notification when AI response is complete.
    /// VI: Thông báo khi AI response hoàn thành.
    /// </summary>
    Task AIResponseComplete(Guid messageId, string fullResponse);

    /// <summary>
    /// EN: Typing indicator notification.
    /// VI: Thông báo đang gõ tin nhắn.
    /// </summary>
    Task TypingIndicator(string userId, string userName, Guid roomId, bool isTyping);

    /// <summary>
    /// EN: Message read receipt notification.
    /// VI: Thông báo đã đọc tin nhắn.
    /// </summary>
    Task MessageRead(string userId, Guid messageId, Guid roomId);

    /// <summary>
    /// EN: User online/offline status change.
    /// VI: Thay đổi trạng thái online/offline của user.
    /// </summary>
    Task UserStatusChanged(string userId, bool isOnline, DateTime? lastSeen);
}

/// <summary>
/// EN: Message notification DTO for SignalR.
/// VI: DTO thông báo tin nhắn cho SignalR.
/// </summary>
public record MessageNotification(
    Guid Id,
    Guid ConversationId,
    string SenderId,
    string SenderName,
    string Content,
    string MessageType,
    DateTime SentAt,
    Guid? ReplyToMessageId = null
);
