module ApiResponseHelper
  class ApiResponseServiceException < Exception; end

  class ApiResponseService
    RESPONSES_FILE_PATH = Rails.root.join("spec/fixtures/responses/responses.json")
    @@responses_hash = nil

    def self.response_body(object, key)
      response_part(object, key, :body).to_json
    end

    def self.response_headers(object, key)
      response_part(object, key, :headers)
    end

    private

    def self.responses
      unless @@responses_hash.present?
        fd = File.open(RESPONSES_FILE_PATH, 'r')
        @@responses_hash = HashWithIndifferentAccess.new(JSON.parse(fd.read))
      end
      @@responses_hash
    end

    def self.object_to_key(object)
      class_name = case object.class.to_s
      when "String"
        object
      when "Class"
        object.name
      else
        object.class.name
      end
      class_name
    end

    def self.response_part(object, key, part = :body)
      object_key = object_to_key(object)
      raise ApiResponseServiceException.new("No #{object_key} in fixtures") unless responses.has_key?(object_key)
      raise ApiResponseServiceException.new("No #{object_key}/#{key} in fixtures") unless responses[object_key].has_key?(key)
      responses[object_key][key.to_s][part]
    end
  end


  def api_response_fixture_body(object, key)
    ApiResponseService.response_body(object.to_s, key)
  end

  def api_response_fixture_headers(object, key)
    ApiResponseService.response_headers(object.to_s, key)
  end

  def api_response_fixture(object, key)
    {body: api_response_fixture_body(object, key), headers: api_response_fixture_headers(object, key)}
  end
end

RSpec.configure do |config|
  config.include ApiResponseHelper
end