class GoodJob::CLI

def cleanup_preserved_jobs

def cleanup_preserved_jobs
  require RAILS_ENVIRONMENT_RB
  timestamp = Time.current - options[:before_seconds_ago]
  result = GoodJob::Job.finished(timestamp).delete_all
  $stdout.puts "Deleted #{result} preserved #{'job'.pluralize(result)} finished before #{timestamp}."
end

def start

def start
  require RAILS_ENVIRONMENT_RB
  max_threads = (
    options[:max_threads] ||
    ENV['GOOD_JOB_MAX_THREADS'] ||
    ENV['RAILS_MAX_THREADS'] ||
    ActiveRecord::Base.connection_pool.size
  ).to_i
  queue_names = (
    options[:queues] ||
    ENV['GOOD_JOB_QUEUES'] ||
    '*'
  ).split(',').map(&:strip)
  poll_interval = (
    options[:poll_interval] ||
    ENV['GOOD_JOB_POLL_INTERVAL']
  ).to_i
  job_query = GoodJob::Job.all.priority_ordered
  queue_names_without_all = queue_names.reject { |q| q == '*' }
  job_query = job_query.where(queue_name: queue_names_without_all) unless queue_names_without_all.size.zero?
  performer_method = if GoodJob.preserve_job_records
                       :perform_with_advisory_lock_and_preserve_job_records
                     else
                       :perform_with_advisory_lock_and_destroy_job_records
                     end
  job_performer = GoodJob::Performer.new(job_query, performer_method)
  $stdout.puts "GoodJob worker starting with max_threads=#{max_threads} on queues=#{queue_names.join(',')}"
  timer_options = {}
  timer_options[:execution_interval] = poll_interval if poll_interval.positive?
  pool_options = {
    max_threads: max_threads,
  }
  scheduler = GoodJob::Scheduler.new(job_performer, timer_options: timer_options, pool_options: pool_options)
  @stop_good_job_executable = false
  %w[INT TERM].each do |signal|
    trap(signal) { @stop_good_job_executable = true }
  end
  Kernel.loop do
    sleep 0.1
    break if @stop_good_job_executable || scheduler.shutdown?
  end
  $stdout.puts "\nFinishing GoodJob's current jobs before exiting..."
  scheduler.shutdown
  $stdout.puts "GoodJob's jobs finished, exiting..."
end