# frozen_string_literal: true

class ScheduleRunnersTokenEncryption < ActiveRecord::Migration[4.2]
  include Gitlab::Database::MigrationHelpers

  DOWNTIME = false
  BATCH_SIZE = 10000
  RANGE_SIZE = 2000
  MIGRATION = 'EncryptRunnersTokens'

  MODELS = [
    ::Gitlab::BackgroundMigration::Models::EncryptColumns::Settings,
    ::Gitlab::BackgroundMigration::Models::EncryptColumns::Namespace,
    ::Gitlab::BackgroundMigration::Models::EncryptColumns::Project,
    ::Gitlab::BackgroundMigration::Models::EncryptColumns::Runner
  ].freeze

  disable_ddl_transaction!

  def up
    MODELS.each do |model|
      model.each_batch(of: BATCH_SIZE) do |relation, index|
        delay = index * 4.minutes

        relation.each_batch(of: RANGE_SIZE) do |relation|
          range = relation.pluck('MIN(id)', 'MAX(id)').first
          args = [model.name.demodulize.downcase, *range]

          BackgroundMigrationWorker.perform_in(delay, MIGRATION, args)
        end
      end
    end
  end

  def down
    # no-op
  end
end