# frozen_string_literal: true

namespace :synchronized_model do

desc 'Publish all records for a model'
task :publish,
     %i(model_class_string touch_records) => :environment do |_t, args|
  logger = Logger.new(STDOUT)
  model_class = get_model_class(args.model_class_string)

  logger.info "#{model_class.count} #{args.model_class_string} to publish"
  model_class.find_each do |model|
    if args.touch_records == 'true'
      logger.info "Touching UUID: #{model.try(:uuid)}, ID: #{model.id}"
      model.update(updated_at: Time.zone.now)
    end
    logger.info "Publishing UUID: #{model.try(:uuid)}, ID: #{model.id}"

    SynchronizedModel::Publish.new(model).call
  end
end

def get_model_class(model_class_string)
  model_class = Module.const_get(model_class_string)

  unless model_class.ancestors.include? ActiveRecord::Base
    fail "#{model_class} is not an ActiveRecord model"
  end

  unless model_class.ancestors.include? SynchronizedModel::PublishMixin
    fail "#{model_class} is not a publishable model"
  end

  model_class
end

end