package org.knowm.xchange.coinbase.dto.merchant; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.knowm.xchange.coinbase.dto.CoinbaseBaseResponse; import org.knowm.xchange.coinbase.dto.common.CoinbaseRepeat; import org.knowm.xchange.coinbase.dto.marketdata.CoinbaseMoney; import org.knowm.xchange.coinbase.dto.serialization.CoinbaseCentsDeserializer; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; /** * @author jamespedwards42 */ public class CoinbaseButton extends CoinbaseBaseResponse { @JsonProperty("button") private final CoinbaseButtonInfo button; private CoinbaseButton(@JsonProperty("button") final CoinbaseButtonInfo button, @JsonProperty("success") final boolean success, @JsonProperty("errors") final List<String> errors) { super(success, errors); this.button = button; } CoinbaseButton(CoinbaseButtonInfo button) { super(true); this.button = button; } @JsonIgnore public CoinbaseButtonType getType() { return button.getType(); } @JsonIgnore public String getName() { return button.getName(); } @JsonIgnore public String getDescription() { return button.getDescription(); } @JsonIgnore public String getId() { return button.getId(); } @JsonIgnore public CoinbaseMoney getPrice() { return button.getPrice(); } @JsonIgnore public String getPriceString() { return button.getPriceString(); } @JsonIgnore public String getCurrency() { return button.getCurrency(); } @JsonIgnore public String getCustom() { return button.getCustom(); } @JsonIgnore public CoinbaseButtonStyle getStyle() { return button.getStyle(); } @JsonIgnore public String getCode() { return button.getCode(); } @JsonIgnore public String getText() { return button.getText(); } @JsonIgnore public CoinbaseRepeat getRepeat() { return button.getRepeat(); } @JsonIgnore public boolean isCustomSecure() { return button.isCustomSecure(); } @JsonIgnore public String getCallbackUrl() { return button.getCallbackUrl(); } @JsonIgnore public String getSuccessUrl() { return button.getSuccessUrl(); } @JsonIgnore public String getCancelUrl() { return button.getCancelUrl(); } @JsonIgnore public String getInfoUrl() { return button.getInfoUrl(); } @JsonIgnore public boolean isAutoReDirect() { return button.isAutoReDirect(); } @JsonIgnore public boolean isVariablePrice() { return button.isVariablePrice(); } @JsonIgnore public boolean isChoosePrice() { return button.isChoosePrice(); } @JsonIgnore public boolean isIncludeAddress() { return button.isIncludeAddress(); } @JsonIgnore public boolean isIncludeEmail() { return button.isIncludeEmail(); } @JsonIgnore public List<String> getSuggestedPrices() { final List<String> suggestedPrices = new ArrayList<String>(); suggestedPrices.add(button.price1); suggestedPrices.add(button.price2); suggestedPrices.add(button.price3); suggestedPrices.add(button.price4); suggestedPrices.add(button.price5); return suggestedPrices; } @JsonIgnore public String getPrice1() { return button.getPrice1(); } @JsonIgnore public String getPrice2() { return button.getPrice2(); } @JsonIgnore public String getPrice3() { return button.getPrice3(); } @JsonIgnore public String getPrice4() { return button.getPrice4(); } @JsonIgnore public String getPrice5() { return button.getPrice5(); } @Override public String toString() { return "CoinbaseButton [button=" + button + "]"; } public static class CoinbaseButtonBuilder { private final String name; private final CoinbaseMoney price; private CoinbaseButtonType type; private String description; private String custom; private CoinbaseButtonStyle style; private String text; private CoinbaseRepeat repeat; private boolean customSecure; private String callbackUrl; private String successUrl; private String cancelUrl; private String infoUrl; private boolean autoDirect; private boolean variablePrice; private boolean choosePrice; private boolean includeAddress; private boolean includeEmail; private String price1; private String price2; private String price3; private String price4; private String price5; public CoinbaseButtonBuilder(String name, final String currency, final String priceString) { this(name, new CoinbaseMoney(currency, new BigDecimal(priceString))); } public CoinbaseButtonBuilder(String name, final CoinbaseMoney price) { this.name = name; this.price = price; } public CoinbaseButton buildButton() { final CoinbaseButtonInfo buttonInfo = new CoinbaseButtonInfo(name, price, type, description, null, custom, style, null, text, repeat, customSecure, callbackUrl, successUrl, cancelUrl, infoUrl, autoDirect, variablePrice, choosePrice, includeAddress, includeEmail, price1, price2, price3, price4, price5); return new CoinbaseButton(buttonInfo); } public String getName() { return name; } public CoinbaseMoney getPrice() { return price; } public String getPriceString() { return price.getAmount().toPlainString(); } public String getCurrency() { return price.getCurrency(); } public CoinbaseButtonType getType() { return type; } public CoinbaseButtonBuilder withType(CoinbaseButtonType type) { this.type = type; return this; } public String getDescription() { return description; } public CoinbaseButtonBuilder withDescription(String description) { this.description = description; return this; } public String getCustom() { return custom; } public CoinbaseButtonBuilder withCustom(String custom) { this.custom = custom; return this; } public CoinbaseButtonStyle getStyle() { return style; } public CoinbaseButtonBuilder withStyle(CoinbaseButtonStyle style) { this.style = style; return this; } public String getText() { return text; } public CoinbaseButtonBuilder withText(String text) { this.text = text; return this; } public CoinbaseRepeat getRepeat() { return repeat; } public CoinbaseButtonBuilder withRepeat(CoinbaseRepeat repeat) { this.repeat = repeat; return this; } public boolean isCustomSecure() { return customSecure; } public CoinbaseButtonBuilder withCustomSecure(boolean customSecure) { this.customSecure = customSecure; return this; } public String getCallbackUrl() { return callbackUrl; } public CoinbaseButtonBuilder withCallbackUrl(String callbackUrl) { this.callbackUrl = callbackUrl; return this; } public String getSuccessUrl() { return successUrl; } public CoinbaseButtonBuilder withSuccessUrl(String successUrl) { this.successUrl = successUrl; return this; } public String getCancelUrl() { return cancelUrl; } public CoinbaseButtonBuilder withCancelUrl(String cancelUrl) { this.cancelUrl = cancelUrl; return this; } public String getInfoUrl() { return infoUrl; } public CoinbaseButtonBuilder withInfoUrl(String infoUrl) { this.infoUrl = infoUrl; return this; } public boolean isAutoDirect() { return autoDirect; } public CoinbaseButtonBuilder withAutoDirect(boolean autoDirect) { this.autoDirect = autoDirect; return this; } public boolean isVariablePrice() { return variablePrice; } public CoinbaseButtonBuilder withVariablePrice(boolean variablePrice) { this.variablePrice = variablePrice; return this; } public boolean isChoosePrice() { return choosePrice; } public CoinbaseButtonBuilder withChoosePrice(boolean choosePrice) { this.choosePrice = choosePrice; return this; } public boolean isIncludeAddress() { return includeAddress; } public CoinbaseButtonBuilder withIncludeAddress(boolean includeAddress) { this.includeAddress = includeAddress; return this; } public boolean isIncludeEmail() { return includeEmail; } public CoinbaseButtonBuilder withIncludeEmail(boolean includeEmail) { this.includeEmail = includeEmail; return this; } public String getPrice1() { return price1; } public String getPrice2() { return price2; } public String getPrice3() { return price3; } public String getPrice4() { return price4; } public String getPrice5() { return price5; } private static final int MAX_SUGGESTED_PRICES = 5; public CoinbaseButtonBuilder withSuggestedPrices(String... suggestedPrices) { if (suggestedPrices.length > MAX_SUGGESTED_PRICES) throw new IllegalArgumentException( "Only " + MAX_SUGGESTED_PRICES + " suggested prices are allowed. There was an attempt to add " + suggestedPrices.length + " prices."); switch (suggestedPrices.length) { case 5: this.price5 = suggestedPrices[4]; case 4: this.price4 = suggestedPrices[3]; case 3: this.price3 = suggestedPrices[2]; case 2: this.price2 = suggestedPrices[1]; case 1: this.price1 = suggestedPrices[0]; } return this; } } static class CoinbaseButtonInfo { private final String name; private final CoinbaseMoney price; private final CoinbaseButtonType type; private final String description; private final String id; private final String custom; private final CoinbaseButtonStyle style; private final String code; private final String text; private final CoinbaseRepeat repeat; private final boolean customSecure; private final String callbackUrl; private final String successUrl; private final String cancelUrl; private final String infoUrl; private final boolean autoReDirect; private final boolean variablePrice; private final boolean choosePrice; private final boolean includeAddress; private final boolean includeEmail; private final String price1; private final String price2; private final String price3; private final String price4; private final String price5; private CoinbaseButtonInfo(@JsonProperty("name") final String name, @JsonProperty("price") @JsonDeserialize(using = CoinbaseCentsDeserializer.class) final CoinbaseMoney price, @JsonProperty("type") final CoinbaseButtonType type, @JsonProperty("description") final String description, @JsonProperty("id") final String id, @JsonProperty("custom") final String custom, @JsonProperty("style") final CoinbaseButtonStyle style, @JsonProperty("code") final String code, @JsonProperty("text") final String text, @JsonProperty("repeat") final CoinbaseRepeat repeat, @JsonProperty("custom_secure") final boolean customSecure, @JsonProperty("callback_url") final String callbackUrl, @JsonProperty("success_url") final String successUrl, @JsonProperty("cancel_url") final String cancelUrl, @JsonProperty("info_url") final String infoUrl, @JsonProperty("auto_redirect") final boolean autoDirect, @JsonProperty("variable_price") final boolean variablePrice, @JsonProperty("choose_price") final boolean choosePrice, @JsonProperty("include_address") final boolean includeAddress, @JsonProperty("include_email") final boolean includeEmail, @JsonProperty("price1") final String price1, @JsonProperty("price2") final String price2, @JsonProperty("price3") final String price3, @JsonProperty("price4") final String price4, @JsonProperty("price5") final String price5) { this.name = name; this.price = price; this.type = type; this.description = description; this.id = id; this.custom = custom; this.style = style; this.code = code; this.text = text; this.repeat = repeat; this.customSecure = customSecure; this.callbackUrl = callbackUrl; this.successUrl = successUrl; this.cancelUrl = cancelUrl; this.infoUrl = infoUrl; this.autoReDirect = autoDirect; this.variablePrice = variablePrice; this.choosePrice = choosePrice; this.includeAddress = includeAddress; this.includeEmail = includeEmail; this.price1 = price1; this.price2 = price2; this.price3 = price3; this.price4 = price4; this.price5 = price5; } @JsonProperty("type") public CoinbaseButtonType getType() { return type; } @JsonProperty("name") public String getName() { return name; } @JsonProperty("description") public String getDescription() { return description; } @JsonIgnore public String getId() { return id; } @JsonIgnore public CoinbaseMoney getPrice() { return price; } @JsonProperty("price_string") public String getPriceString() { return price.getAmount().toPlainString(); } @JsonProperty("price_currency_iso") public String getCurrency() { return price.getCurrency(); } @JsonProperty("custom") public String getCustom() { return custom; } @JsonProperty("style") public CoinbaseButtonStyle getStyle() { return style; } @JsonIgnore public String getCode() { return code; } @JsonProperty("text") public String getText() { return text; } @JsonProperty("repeat") public CoinbaseRepeat getRepeat() { return repeat; } @JsonProperty("custom_secure") public boolean isCustomSecure() { return customSecure; } @JsonProperty("callback_url") public String getCallbackUrl() { return callbackUrl; } @JsonProperty("success_url") public String getSuccessUrl() { return successUrl; } @JsonProperty("cancel_url") public String getCancelUrl() { return cancelUrl; } @JsonProperty("info_url") public String getInfoUrl() { return infoUrl; } @JsonProperty("auto_direct") public boolean isAutoReDirect() { return autoReDirect; } @JsonProperty("variable_price") public boolean isVariablePrice() { return variablePrice; } @JsonProperty("choose_price") public boolean isChoosePrice() { return choosePrice; } @JsonProperty("include_address") public boolean isIncludeAddress() { return includeAddress; } @JsonProperty("include_email") public boolean isIncludeEmail() { return includeEmail; } @JsonProperty("price1") public String getPrice1() { return price1; } @JsonProperty("price2") public String getPrice2() { return price2; } @JsonProperty("price3") public String getPrice3() { return price3; } @JsonProperty("price4") public String getPrice4() { return price4; } @JsonProperty("price5") public String getPrice5() { return price5; } @Override public String toString() { return "CoinbaseButtonInfo [name=" + name + ", price=" + price + ", type=" + type + ", description=" + description + ", id=" + id + ", custom=" + custom + ", style=" + style + ", code=" + code + ", text=" + text + ", repeat=" + repeat + ", customSecure=" + customSecure + ", callbackUrl=" + callbackUrl + ", successUrl=" + successUrl + ", cancelUrl=" + cancelUrl + ", infoUrl=" + infoUrl + ", autoDirect=" + autoReDirect + ", variablePrice=" + variablePrice + ", choosePrice=" + choosePrice + ", includeAddress=" + includeAddress + ", includeEmail=" + includeEmail + ", price1=" + price1 + ", price2=" + price2 + ", price3=" + price3 + ", price4=" + price4 + ", price5=" + price5 + "]"; } } }