# frozen_string_literal: true

namespace :dis do

desc "Check stuff"
task consistency_check: :environment do
  unless ENV["MODELS"]
    puts "Usage: #{$PROGRAM_NAME} dis:consistency_check " \
         "MODELS=Avatar,Document"
    exit
  end

  models = ENV["MODELS"].split(",").map(&:strip).map(&:constantize)

  jobs = Set.new

  models.each do |model|
    puts "-- #{model.name} --"

    content_hash_attr = model.dis_attributes[:content_hash]
    objects = model.pluck(content_hash_attr).uniq
    global_missing = objects.dup

    puts "Unique objects: #{objects.length}"

    Dis::Storage.layers.each do |layer|
      print "Checking #{layer.name}... "

      existing = layer.existing(model.dis_type, objects)
      missing = objects - existing
      global_missing -= existing
      puts "#{existing.length} existing, #{missing.length} missing" +
           (layer.readonly? ? " (read-only)" : "")

      next unless layer.delayed? && !layer.readonly?

      jobs += (missing - global_missing).pmap do |hash|
        [model.dis_type, hash]
      end.compact
    end

    if global_missing.any?
      puts "\n#{global_missing.length} objects are missing from all layers:"
      pp global_missing
    end

    puts
  end

  if jobs.any?
    print "#{jobs.length} objects can be transferred to delayed layers, " \
          "queue now? (y/n) "
    response = $stdin.gets.chomp
    if /^y/i.match?(response)
      puts "Queueing jobs..."
      jobs.each { |type, hash| Dis::Jobs::Store.perform_later(type, hash) }
    end
  end
end

end