module Actions
  module Katello
    module Applicability
      module Hosts
        class BulkGenerate < Actions::EntryAction
          input_format do
            param :host_ids, Array
          end

          def run
            error = false
            input[:host_ids].each do |host_id|
              content_facet = ::Katello::Host::ContentFacet.find_by_host_id(host_id)
              if content_facet.present?
                # Catch errors and log them, but continue processing the rest of the hosts
                content_facet.calculate_and_import_applicability
              else
                Rails.logger.warn(_("Content Facet for host with id %s is non-existent. Skipping applicability calculation.") % host_id)
              end
            rescue NoMethodError, PG::Error => e
              Rails.logger.error("Error calculating applicability for host #{host_id}: #{e.message}")
              error = true
            end
            fail "Error calculating applicability for one or more hosts" if error
          end

          def rescue_strategy
            Dynflow::Action::Rescue::Skip
          end

          def queue
            ::Katello::HOST_TASKS_QUEUE
          end

          def resource_locks
            :link
          end

          def hostname(host_id)
            content_facet = ::Katello::Host::ContentFacet.find_by_host_id(host_id)
            content_facet&.host&.name
          end

          def humanized_name
            if input && input[:host_ids]&.length == 1
              _("Bulk generate applicability for host %s" % hostname(input[:host_ids]&.first))
            else
              _("Bulk generate applicability for hosts")
            end
          end
        end
      end
    end
  end
end
