class Notification < ApplicationRecord
  belongs_to :recipient, class_name: 'User'
  belongs_to :target, polymorphic: true

  class << self
    include CursorPaginatable

    define_cursor_paginator :cursored_for, :for
    define_cursor_paginator :cursored_for_type, :for_type

    def for(recipient, options={})
      self.where(options.merge!(recipient: recipient)).order(:created_at).reverse_order
    end

    def for_type(recipient, type, options={})
      self.where(options.merge!(recipient: recipient)).where('LOWER(target_type) = ?', type).order(:created_at).reverse_order
    end

    def notify(recipient, target)
      return nil unless target.respond_to? :notification_type

      notif_type = target.notification_type
      return nil unless notif_type

      make_notification(recipient, target, notif_type)
    end

    def denotify(recipient, target)
      return nil unless target.respond_to? :notification_type

      notif_type = target.notification_type
      return nil unless notif_type

      notif = notif_type.find_by(recipient: recipient, target: target)
      notif.destroy unless notif.nil?
    end

    private

      def make_notification(recipient, target, notification_type)
        n = notification_type.new(target: target,
                                  recipient: recipient,
                                  new: true)
        n.save!
        n
      end
  end
end