require_dependency 'discourse_observer'

# This class is responsible for notifying the message bus of various
# events.
class MessageBusObserver < DiscourseObserver
  observe :notification, :user_action, :topic

  def after_create_notification(notification)
    refresh_notification_count(notification)
  end

  def after_destroy_notification(notification)
    refresh_notification_count(notification)
  end

  def after_create_user_action(user_action)
    MessageBus.publish("/users/#{user_action.user.username.downcase}", user_action.id)
  end

  def after_create_topic(topic)

    # Don't publish invisible topics
    return unless topic.visible?

    return if topic.private_message?

    topic.posters = topic.posters_summary
    topic.posts_count = 1
    topic_json = TopicListItemSerializer.new(topic).as_json
    MessageBus.publish("/latest", topic_json)

    # If it has a category, add it to the category views too
    if topic.category.present?
      MessageBus.publish("/category/#{topic.category.slug}", topic_json)
    end

  end

  protected

    def refresh_notification_count(notification)
      user_id = notification.user.id
      MessageBus.publish("/notification/#{user_id}",
        {unread_notifications: notification.user.unread_notifications,
         unread_private_messages: notification.user.unread_private_messages},
        user_ids: [user_id] # only publish the notification to this user
      )
    end
end