#!/usr/bin/env ruby
# frozen_string_literal: true

$stdout.sync = true

require "rufus-scheduler"
require_relative "../boot"
require "provider"
require "provider/adapters"

dry_run = ARGV.include?("--dry-run")

scheduler = Rufus::Scheduler.new(max_work_threads: DB.pool.max_size) unless dry_run

# Backfill all providers on startup (staggered to avoid thundering herd)
Provider.all.shuffle.each do |provider|
  if dry_run
    puts "startup: backfill[#{provider.key.downcase}]"
  else
    scheduler.in("0s") do
      provider.backfill
    end
  end
end

# Schedule each provider based on its publish_schedule cron expression.
Provider.all.each do |provider|
  next unless provider.publish_schedule

  if dry_run
    puts "cron: #{provider.publish_schedule} backfill[#{provider.key.downcase}]"
  else
    scheduler.cron(provider.publish_schedule, overlap: false) do
      provider.backfill
    end
  end
end

scheduler.join unless dry_run
