module ChecksKbClientNotification
  extend ActiveSupport::Concern

  included do
    after_create  :notify_kb_clients_after_create
    after_update  :notify_kb_clients_after_update
    after_touch   :notify_kb_clients_after_touch
    after_destroy :notify_kb_clients_after_destroy

    class_attribute :notify_kb_clients_suspend, default: false
  end

  def self.disable_in_all_classes!
    all_classes.each { |klass| klass.notify_kb_clients_suspend = true }
  end

  def self.enable_in_all_classes!
    all_classes.each { |klass| klass.notify_kb_clients_suspend = false }
  end

  def self.all_classes
    ActiveRecord::Base
      .descendants
      .select { |c| c.included_modules.include?(ChecksKbClientNotification) }
  end

  private

  # generic call

  def notify_kb_clients(event)
    return if self.class.notify_kb_clients_suspend?

    ChecksKbClientNotificationJob.notify_later(self, event)
  end

  def notify_kb_clients_after_create
    notify_kb_clients(:create)
  end

  def notify_kb_clients_after_update
    notify_kb_clients(:update)
  end

  def notify_kb_clients_after_touch
    notify_kb_clients(:touch)
  end

  def notify_kb_clients_after_destroy
    notify_kb_clients(:destroy)
  end
end
