# frozen_string_literal: true

module Jobs
  # This job runs all of the scheduled problem checks for the admin dashboard
  # on a regular basis. To add a problem check, add a new class that inherits
  # the `ProblemCheck` base class.
  class RunProblemChecks < ::Jobs::Scheduled
    sidekiq_options retry: false

    every 10.minutes

    def execute(_args)
      scheduled_checks =
        ProblemCheckTracker.all.filter_map do |tracker|
          tracker.check if eligible_for_this_run?(tracker)
        end

      scheduled_checks.each do |check|
        Jobs.enqueue(:run_problem_check, check_identifier: check.identifier.to_s)
      end
    end

    private

    def eligible_for_this_run?(tracker)
      tracker.check.present? && tracker.check.enabled? && tracker.check.scheduled? &&
        tracker.ready_to_run?
    end
  end
end