# frozen_string_literal: true

class BaseNotification < Noticed::Base
  deliver_by :database, if: :database_notification?
  deliver_by :email, mailer: 'AppMailer', method: :general_notification, if: :email_notification?

  def self.send_notifications(params, later: true)
    recipients_class =
      "Recipients::#{NotificationExtends::NOTIFICATIONS_TYPES[subtype || params[:type]][:recipients_module]}".constantize
    recipients_class.new(params).recipients.each do |recipient|
      if later
        with(params).deliver_later(recipient)
      else
        with(params).deliver(recipient)
      end
    end
  end

  def self.subtype; end

  def subtype
    self.class.subtype || params[:type]
  end

  def subject; end

  def message
    params[:message]
  end

  def title
    params[:title]
  end

  private

  def subject_class
    ApplicationRecord.descendants.find { |klass| klass.name == params[:subject_class] }
  end

  def database_notification?
    # always save all notifications,
    # but flag if they should display in app or not

    params[:hide_in_app] = recipient.notifications_settings.dig(notification_subgroup.to_s, 'in_app') != true

    true
  end

  def email_notification?
    recipient.notifications_settings.dig(notification_subgroup.to_s, 'email')
  end

  def notification_subgroup
    NotificationExtends::NOTIFICATIONS_GROUPS.values.reduce({}, :merge).find do |_sg, n|
      n.include?(subtype.to_sym)
    end[0]
  end
end
