# frozen_string_literal: true

desc "Refresh all avatars (download missing gravatars, refresh system)"
task "avatars:refresh" => :environment do
  i = 0

  puts "Refreshing avatars"
  puts

  User.find_each do |user|
    begin
      user.refresh_avatar
      user.user_avatar.update_gravatar!
    rescue => e
      puts "", "Failed to refresh avatar for #{user.username}", e, e.backtrace.join("\n")
    end
    putc "." if (i += 1) % 10 == 0
  end

  puts
end

desc "Clean up all avatar thumbnails (use this when the thumbnail algorithm changes)"
task "avatars:clean" => :environment do
  i = 0

  puts "Cleaning up avatar thumbnails"
  puts

  optimized_image_ids =
    OptimizedImage.where(
      "upload_id IN (SELECT custom_upload_id FROM user_avatars) OR
                        upload_id IN (SELECT gravatar_upload_id FROM user_avatars) OR
                        upload_id IN (SELECT uploaded_avatar_id FROM users)",
    ).pluck(:id)

  optimized_image_ids.each do |id|
    begin
      optimized_image = OptimizedImage.find_by(id: id)
      next unless optimized_image.present?
      optimized_image.destroy!
    rescue => e
      puts "", "Failed to cleanup avatar (optimized_image id: #{id})", e, e.backtrace.join("\n")
    end
    putc "." if (i += 1) % 10 == 0
  end

  puts
end