# frozen_string_literal: true

namespace :after_party do
  desc 'Deployment task: normalize_checkbox_values'
  task normalize_checkbox_values: :environment do
    puts "Running deploy task 'normalize_checkbox_values'"

    scope_blank = Champs::CheckboxChamp.where(value: '')
    scope_on = Champs::CheckboxChamp.where(value: 'on')
    scope_off = Champs::CheckboxChamp.where(value: 'off')
    scope_invalid = Champs::CheckboxChamp.where.not(value: [nil, 'true', 'false'])

    progress = ProgressReport.new(scope_blank.count + scope_on.count + scope_off.count + scope_invalid.count)
    update_all(scope_blank, nil, progress)
    update_all(scope_on, 'true', progress)
    update_all(scope_off, 'false', progress)
    update_all(scope_invalid, 'false', progress)
    progress.finish

    # Update task as completed.  If you remove the line below, the task will
    # run with every deploy (or every time you call after_party:run).
    AfterParty::TaskRecord
      .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
  end

  private

  def update_all(scope, value, progress)
    scope.in_batches(of: 10_000) do |checkboxes|
      progress.inc(checkboxes.count)
      checkboxes.update_all(value: value)
    end
  end
end