# frozen_string_literal: true

# bulk grant badge to members of a specific group
task "groups:grant_badge", %i[group_id badge_id] => [:environment] do |_, args|
  group_id = args[:group_id]
  badge_id = args[:badge_id]

  if !group_id || !badge_id
    puts "ERROR: Expecting groups:grant_badge[group_id,badge_id]"
    exit 1
  end

  group = Group.find_by(id: group_id)

  unless group
    puts "ERROR: `group_id` is invalid"
    exit 1
  end

  badge = Badge.find_by(id: badge_id)

  unless badge
    puts "ERROR: `badge_id` is invalid"
    exit 1
  end

  puts "Granting badge '#{badge.name}' to all users in group '#{group.name}'..."

  count = 0
  group.users.each do |user|
    begin
      BadgeGranter.grant(badge, user)
    rescue => e
      puts "", "Failed to grant badge to #{user.username}", e, e.backtrace.join("\n")
    end
    putc "." if (count += 1) % 5 == 0
  end

  puts "", "Done! Badge granted to #{count} members.", ""
end