class Notification::Service::StudentLogJob
  include Sidekiq::Worker

  def perform(id, status)
    log = Service::StudentLog.find(id)
    school = log.school
    student_config = school.find_or_build_student_module
    family_config = school.find_or_build_family_module
    employee_config = school.find_or_build_employee_module
    service_setting = school.find_or_build_service_setting

    if status.to_sym == :approved
      if student_config.service? && (service_setting.track_student? || service_setting.track_both?)
        return unless log.student.user_id?

        Notification::OneSignalJob.perform_async(
          log.student.user_id,
          { en: 'Service log has been approved' },
          { en: 'Service Log Approved' },
          '/student?task=service_student_log'
        )
      end

      if family_config.service? && (service_setting.track_student? || service_setting.track_both?)
        family_user_ids = [log.family&.user&.id]
        family_user_ids += log.family.primary_contacts.pluck(:user_id)
        family_users = school.users.where(id: family_user_ids)
          .joins(:family_notification_config)
          .where.not(family_notification_configs: { service: :none })

        family_push = []
        family_app = []

        family_users.each do |user|
          config = user.find_or_build_family_notification_config
          family_push << user.id if config.service_both? || config.service_push?

          family_app << user.id if config.service_both? || config.service_app?
        end

        Notification::OneSignalJob.perform_async(
          family_push,
          { en: 'Service log has been approved' },
          { en: 'Service Log Approved' },
          '/family?task=service_student_log'
        )
      end

    elsif status.to_sym == :pending
      return unless employee_config.service? &&
        (service_setting.track_student? || service_setting.track_both?)

      employee_users = school.employees
        .joins(:employee_notification_config)
        .is_current(true)
        .where.not(employee_notification_configs: { service: :none })

      employee_push = []
      employee_app = []

      employee_users.each do |user|
        config = user.find_or_build_employee_notification_config
        employee_push << user.id if config.service_both? || config.service_push?

        employee_app << user.id if config.service_both? || config.service_app?
      end

      Notification::OneSignalJob.perform_async(
        family_push,
        { en: 'Service log has been created' },
        { en: 'Service Log created' },
        "/employee?task=service_student_log&id=#{log.id}"
      )
    end
  end
end
