namespace :katello do

desc "Removes custom products (and their associated pools and subscriptions) from Candlepin that are not in Katello"
task :clean_candlepin_orphaned_products => ["dynflow:client", "environment"] do
  User.current = User.anonymous_admin #set a user for orchestration

  deleted_products_counts = {}
  Organization.all.each do |org|
    print "Cleaning Candlepin orphaned custom products for organization #{org.name}\n"

    cp_products = Katello::Resources::Candlepin::Product.all(org.label)
    cp_products = cp_products.select { |prod| Katello::Glue::Candlepin::Product.engineering_product_id?(prod['id']) }
    cp_product_ids = cp_products.map { |cp_product| cp_product['id'] }

    katello_product_ids = Katello::Product.where(:organization_id => org.id).pluck(:cp_id)
    orphaned_cp_product_ids = cp_product_ids - katello_product_ids
    orphaned_cp_product_ids.each do |cp_product_id|
      print "Deleting Candlepin orphaned custom product #{cp_product_id} (and its associated pools and subscriptions)\n"
      ForemanTasks.sync_task(
        ::Actions::Candlepin::Product::DeletePools,
        cp_id: cp_product_id, organization_label: org.label)

      ForemanTasks.sync_task(
        ::Actions::Candlepin::Product::DeleteSubscriptions,
        cp_id: cp_product_id, organization_label: org.label)

      ForemanTasks.sync_task(
        ::Actions::Candlepin::Product::Destroy,
        owner: org.label, cp_id: cp_product_id)
    end

    deleted_products_counts[org.name] = orphaned_cp_product_ids.length
  end

  deleted_products_counts.each do |org_name, deleted_products_count|
    print "Deleted #{deleted_products_count} Candlepin orphaned custom products for organization #{org_name}\n"
  end
end

end