# frozen_string_literal: true

require_relative './report_invalid_description'
require_relative './report_not_found'

# All(?) Rack code is namespaced within this module.
module Rack
  # Module includes our middleware components for managing service API versions.
  module ServiceApiVersioning
    # Validates input for AcceptContentTypeSelector. If input passes checks,
    # returns `nil`. Returns a Rack::Response instance if any validation step
    # failed.
    class InputIsInvalid
      def self.call(input)
        Internals.verify_input(input) || Internals.verify_api_versions(input)
      end

      # Stateless methods
      module Internals
        def self._api_versions?(input)
          input.data[:api_versions].any?
        end

        def self.verify_api_versions(input)
          return ReportNotFound.call unless _api_versions?(input)
          nil
        end

        def self.verify_input(input)
          return ReportInvalidDescription.call unless input.any?
          nil
        end
      end
    end # class Rack::ServiceApiVersioning::InputIsInvalid
  end
end