class UserNotification < ApplicationRecord
  include NotificationsHelper

  belongs_to :user, optional: true
  belongs_to :notification, optional: true

  after_save :send_email

  def self.last_notifications(
    user,
    last_notification_id = nil,
    per_page = Constants::ACTIVITY_AND_NOTIF_SEARCH_LIMIT
  )
    last_notification_id = Constants::INFINITY if last_notification_id < 1
    Notification.joins(:user_notifications)
                .where('user_notifications.user_id = ?', user.id)
                .where('notifications.id < ?', last_notification_id)
                .order(created_at: :DESC)
                .limit(per_page)
  end

  def self.recent_notifications(user)
    Notification.joins(:user_notifications)
                .where('user_notifications.user_id = ?', user.id)
                .order(created_at: :DESC)
                .limit(Constants::ACTIVITY_AND_NOTIF_SEARCH_LIMIT)
  end

  def self.unseen_notification_count(user)
    where('user_id = ? AND checked = false', user.id).count
  end

  def self.seen_by_user(user)
    where(user: user).where(checked: false).update_all(checked: true)
  end

  def send_email
    case notification.type_of
    when 'system_message'
      send_email_notification(
        user,
        notification
      ) if user.system_message_email_notification
    when 'assignment'
      send_email_notification(
        user,
        notification
      ) if user.assignments_email_notification
    when 'recent_changes'
      send_email_notification(
        user,
        notification
      ) if user.recent_email_notification
    when 'deliver'
      send_email_notification(
        user,
        notification
      )
    end
  end
end