require 'footrest/client'

module Catalogcat
  class Client < Footrest::Client
    require 'catalogcat/api_array' # monkey patch

    Dir[File.join(__dir__, 'client', '*.rb')].each do |mod|
      mname = File.basename(mod, '.*').camelize
      require mod
      include "Catalogcat::Client::#{mname}".constantize
    end

    # Override Footrest connection to use Token authorization
    # rubocop:disable Naming/AccessorMethodName
    def set_connection(config)
      super
      connection.builder.insert(Footrest::RaiseFootrestErrors, ExtendedRaiseFootrestErrors)
      connection.builder.delete(Footrest::RaiseFootrestErrors)
      connection.headers[:authorization].sub! 'Bearer', 'Token'
    end
    # rubocop:enable Naming/AccessorMethodName

    # Override Footrest request for ApiArray support
    def request(method, &block)
      response = connection.send(method, &block)
      raise Footrest::HttpError::ErrorBase, response if response.status >= 400

      Catalogcat::ApiArray.process_response(response, self)
    end
  end

  class ExtendedRaiseFootrestErrors < Footrest::RaiseFootrestErrors
    def on_complete(response)
      super
      key = response[:status].to_i
      raise ERROR_MAP[key.floor(-2)], response if key >= 400
    end
  end
end