module Braintree
  class DocumentUploadGateway
    include BaseModule

    def initialize(gateway)
      @gateway = gateway
      @config = gateway.config
      @config.assert_has_access_token_or_keys
    end

    def create(attributes)
      Util.verify_keys(DocumentUploadGateway._create_signature, attributes)
      _do_create "/document_uploads", {"document_upload[kind]" => attributes[:kind]}, attributes[:file]
    end

    def create!(*args)
      return_object_or_raise(:document_upload) { create(*args) }
    end

    def self._create_signature
      [
        :kind,
        :file
      ]
    end

    def _do_create(path, params, file)
      response = @config.http.post("#{@config.base_merchant_path}#{path}", params, file)
      if response[:document_upload]
        SuccessfulResult.new(:document_upload => DocumentUpload._new(response[:document_upload]))
      elsif response[:api_error_response]
        ErrorResult.new(@gateway, response[:api_error_response])
      else
        raise UnexpectedError, "expected :document_upload or :api_error_response"
      end
    end
  end
end
