package com.braintreegateway;
import java.util.HashMap;
import java.util.Map;
/**
* Provides a fluent interface to build up requests around {@link Customer Customers}.
*/
public class CustomerRequest extends Request {
private String deviceData;
private String company;
private String customerId;
private String deviceSessionId;
private String fraudMerchantId;
private String email;
private String fax;
private String firstName;
private String id;
private String lastName;
private String phone;
private String website;
private String paymentMethodNonce;
private String defaultPaymentMethodToken;
private Map<String, String> customFields;
private CreditCardRequest creditCardRequest;
private RiskDataCustomerRequest riskDataCustomerRequest;
private CustomerOptionsRequest optionsRequest;
private TransactionRequest parent;
public CustomerRequest() {
this.customFields = new HashMap<String, String>();
}
public CustomerRequest(TransactionRequest transactionRequest) {
this();
this.parent = transactionRequest;
}
public CustomerRequest deviceData(String deviceData) {
this.deviceData = deviceData;
return this;
}
public CustomerRequest company(String company) {
this.company = company;
return this;
}
public CreditCardRequest creditCard() {
creditCardRequest = new CreditCardRequest(this);
return this.creditCardRequest;
}
public CustomerRequest customerId(String customerId) {
this.customerId = customerId;
return this;
}
public CustomerRequest customField(String apiName, String value) {
customFields.put(apiName, value);
return this;
}
public CustomerRequest deviceSessionId(String deviceSessionId) {
this.deviceSessionId = deviceSessionId;
return this;
}
public CustomerRequest fraudMerchantId(String fraudMerchantId) {
this.fraudMerchantId = fraudMerchantId;
return this;
}
public TransactionRequest done() {
return parent;
}
public CustomerRequest email(String email) {
this.email = email;
return this;
}
public CustomerRequest fax(String fax) {
this.fax = fax;
return this;
}
public CustomerRequest firstName(String firstName) {
this.firstName = firstName;
return this;
}
public RiskDataCustomerRequest riskData() {
riskDataCustomerRequest = new RiskDataCustomerRequest(this);
return this.riskDataCustomerRequest;
}
public CustomerOptionsRequest options() {
this.optionsRequest = new CustomerOptionsRequest(this);
return optionsRequest;
}
@Override
public String getKind() {
if (this.customerId == null) {
return TransparentRedirectGateway.CREATE_CUSTOMER;
} else {
return TransparentRedirectGateway.UPDATE_CUSTOMER;
}
}
public CustomerRequest lastName(String lastName) {
this.lastName = lastName;
return this;
}
public CustomerRequest id(String id) {
this.id = id;
return this;
}
public String getId() {
return id;
}
public CustomerRequest phone(String phone) {
this.phone = phone;
return this;
}
public CustomerRequest website(String website) {
this.website = website;
return this;
}
public CustomerRequest paymentMethodNonce(String nonce) {
this.paymentMethodNonce = nonce;
return this;
}
public CustomerRequest defaultPaymentMethodToken(String token) {
this.defaultPaymentMethodToken = token;
return this;
}
@Override
public String toXML() {
return buildRequest("customer").toXML();
}
@Override
public String toQueryString() {
return toQueryString("customer");
}
@Override
public String toQueryString(String root) {
return buildRequest(root).
addTopLevelElement("customerId", customerId).
toQueryString();
}
protected RequestBuilder buildRequest(String root) {
RequestBuilder builder = new RequestBuilder(root).
addElement("deviceData", deviceData).
addElement("company", company).
addElement("email", email).
addElement("fax", fax).
addElement("firstName", firstName).
addElement("id", id).
addElement("lastName", lastName).
addElement("phone", phone).
addElement("website", website).
addElement("paymentMethodNonce", paymentMethodNonce).
addElement("defaultPaymentMethodToken", defaultPaymentMethodToken).
addElement("creditCard", creditCardRequest).
addElement("options", optionsRequest);
if (customFields.size() > 0) {
builder.addElement("customFields", customFields);
}
return builder;
}
}