// Path: src/main/java/com/lookfirst/wepay/api/CheckoutUri.java
// @Data
// @EqualsAndHashCode(callSuper=false)
// public class CheckoutUri extends CheckoutId {
// 	private static final long serialVersionUID = 1L;
// 
// 	/** The uri you can send a user to so they can pay. */
// 	private String checkoutUri;
// 
// }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// public static enum FeePayer { payer, payee, payer_from_app, payee_from_app }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// public static enum Mode { iframe, regular }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// public static enum PaymentType { GOODS, SERVICE, DONATION, EVENT, PERSONAL }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// @Data
// public static class PrefillInfo {
// 	String name;
// 	String email;
// 	String phoneNumber;
// 	String address;
// 	String city;
// 	String state;
// 	String zip;
// 	String country;
// 	String region;
// 	String postcode;
// }


import com.lookfirst.wepay.api.CheckoutUri;
import com.lookfirst.wepay.api.Constants.FeePayer;
import com.lookfirst.wepay.api.Constants.Mode;
import com.lookfirst.wepay.api.Constants.PaymentType;
import com.lookfirst.wepay.api.Constants.PrefillInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
package com.lookfirst.wepay.api.req;



/**
 * https://stage.wepay.com/developer/reference/checkout
 *
 * Creates a checkout for an account. The application can send a user to the checkout_uri so the user can pay the account for the amount specified.
 * NOTE: Checkouts will be expired 30 minutes after they are created if their is no activity on them (ie they were abandoned after creation).
 *
 * When the payer completes the payment, they will be returned to the redirect_uri you used in the /checkout/create call.
 * The checkout_id and the payment authorization code will be uri encoded in the redirect_uri so that you can confirm that the payment was made.
 * You can also use the Instant Payment Notifications system to receive push notifications of checkout state changes.
 * If you did not specify a redirect_uri, they will be returned to the application homepage.
 *
 * @author Jon Scott Stevens
 * @author Jeff Schnitzer
 */
@Data
@EqualsAndHashCode(callSuper=false)
public class CheckoutCreateRequest extends WePayRequest<CheckoutUri> {

	/** The unique ID of the account you want to create a checkout for. */
	private Long accountId;
	/** A short description of what is being paid for. */
	private String shortDescription;
	/** A long description of what is being paid for. */
	private String longDescription;

	/** A short message that will be included in the payment confirmation email to the payer. */
	private String payerEmailMessage;
	/** A short message that will be included in the payment confirmation email to the payee. */
	private String payeeEmailMessage;

	/** Required. The the checkout type (one of the following: GOODS, SERVICE, DONATION, or PERSONAL) */
	private PaymentType type;
	/** The unique reference id of the checkout (set by the application in /checkout/create */
	private String referenceId;
	/** The amount that the payer will pay. */
	private BigDecimal amount;
	/** The currency used, default "USD" ("USD" for now). */
	private String currency;
	/** The amount that the application will receive in fees. App fees go into the API applications WePay account. */
	private BigDecimal appFee;
	/** Who will pay the fees (WePay's fees and any app fees). Set to "Payer" to charge fees to the person paying (Payer will pay amount + fees, payee will receive amount). Set to "Payee" to charge fees to the person receiving money (Payer will pay amount, Payee will receive amount - fees). Defaults to "Payer". */
	private FeePayer feePayer;
	/** The uri the payer will be redirected to after paying. */
	private String redirectUri;
	/** The uri that will receive any Instant Payment Notifications sent. Needs to be a full uri (ex https://www.wepay.com ) */
	private String callbackUri;
	/** The uri that the payer will be redirected to if cookies cannot be set in the iframe; will only work if mode is iframe. */
	private String fallbackUri;
	/** A boolean value (0 or 1). Default is 1. If set to 0 then the payment will not automatically be released to the account and will be held by WePay in payment state 'reserved'. To release funds to the account you must call /checkout/capture */
	private boolean autoCapture;
	/** A boolean value (0 or 1). If set to 1 then the payer will be asked to enter a shipping address when they pay. After payment you can retrieve this shipping address by calling /checkout */
	private boolean requireShipping;
	/** The amount that you want to charge for shipping. */
	private BigDecimal shippingFee;
	/** A boolean value (0 or 1). If set to 1 and the account has a relevant tax entry (see /account/set_tax), then tax will be charged. */
	private boolean chargeTax;
	/** What mode the checkout will be displayed in. The options are 'iframe' or 'regular'. Choose 'iframe' if this is an iframe checkout. Mode defaults to 'regular'. */
// Path: src/main/java/com/lookfirst/wepay/api/CheckoutUri.java
// @Data
// @EqualsAndHashCode(callSuper=false)
// public class CheckoutUri extends CheckoutId {
// 	private static final long serialVersionUID = 1L;
// 
// 	/** The uri you can send a user to so they can pay. */
// 	private String checkoutUri;
// 
// }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// public static enum FeePayer { payer, payee, payer_from_app, payee_from_app }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// public static enum Mode { iframe, regular }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// public static enum PaymentType { GOODS, SERVICE, DONATION, EVENT, PERSONAL }
// 
// Path: src/main/java/com/lookfirst/wepay/api/Constants.java
// @Data
// public static class PrefillInfo {
// 	String name;
// 	String email;
// 	String phoneNumber;
// 	String address;
// 	String city;
// 	String state;
// 	String zip;
// 	String country;
// 	String region;
// 	String postcode;
// }


// Path: src/main/java/com/lookfirst/wepay/api/req/CheckoutCreateRequest.java
import com.lookfirst.wepay.api.CheckoutUri;
import com.lookfirst.wepay.api.Constants.FeePayer;
import com.lookfirst.wepay.api.Constants.Mode;
import com.lookfirst.wepay.api.Constants.PaymentType;
import com.lookfirst.wepay.api.Constants.PrefillInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;

package com.lookfirst.wepay.api.req;



/**
 * https://stage.wepay.com/developer/reference/checkout
 *
 * Creates a checkout for an account. The application can send a user to the checkout_uri so the user can pay the account for the amount specified.
 * NOTE: Checkouts will be expired 30 minutes after they are created if their is no activity on them (ie they were abandoned after creation).
 *
 * When the payer completes the payment, they will be returned to the redirect_uri you used in the /checkout/create call.
 * The checkout_id and the payment authorization code will be uri encoded in the redirect_uri so that you can confirm that the payment was made.
 * You can also use the Instant Payment Notifications system to receive push notifications of checkout state changes.
 * If you did not specify a redirect_uri, they will be returned to the application homepage.
 *
 * @author Jon Scott Stevens
 * @author Jeff Schnitzer
 */
@Data
@EqualsAndHashCode(callSuper=false)
public class CheckoutCreateRequest extends WePayRequest<CheckoutUri> {

	/** The unique ID of the account you want to create a checkout for. */
	private Long accountId;
	/** A short description of what is being paid for. */
	private String shortDescription;
	/** A long description of what is being paid for. */
	private String longDescription;

	/** A short message that will be included in the payment confirmation email to the payer. */
	private String payerEmailMessage;
	/** A short message that will be included in the payment confirmation email to the payee. */
	private String payeeEmailMessage;

	/** Required. The the checkout type (one of the following: GOODS, SERVICE, DONATION, or PERSONAL) */
	private PaymentType type;
	/** The unique reference id of the checkout (set by the application in /checkout/create */
	private String referenceId;
	/** The amount that the payer will pay. */
	private BigDecimal amount;
	/** The currency used, default "USD" ("USD" for now). */
	private String currency;
	/** The amount that the application will receive in fees. App fees go into the API applications WePay account. */
	private BigDecimal appFee;
	/** Who will pay the fees (WePay's fees and any app fees). Set to "Payer" to charge fees to the person paying (Payer will pay amount + fees, payee will receive amount). Set to "Payee" to charge fees to the person receiving money (Payer will pay amount, Payee will receive amount - fees). Defaults to "Payer". */
	private FeePayer feePayer;
	/** The uri the payer will be redirected to after paying. */
	private String redirectUri;
	/** The uri that will receive any Instant Payment Notifications sent. Needs to be a full uri (ex https://www.wepay.com ) */
	private String callbackUri;
	/** The uri that the payer will be redirected to if cookies cannot be set in the iframe; will only work if mode is iframe. */
	private String fallbackUri;
	/** A boolean value (0 or 1). Default is 1. If set to 0 then the payment will not automatically be released to the account and will be held by WePay in payment state 'reserved'. To release funds to the account you must call /checkout/capture */
	private boolean autoCapture;
	/** A boolean value (0 or 1). If set to 1 then the payer will be asked to enter a shipping address when they pay. After payment you can retrieve this shipping address by calling /checkout */
	private boolean requireShipping;
	/** The amount that you want to charge for shipping. */
	private BigDecimal shippingFee;
	/** A boolean value (0 or 1). If set to 1 and the account has a relevant tax entry (see /account/set_tax), then tax will be charged. */
	private boolean chargeTax;
	/** What mode the checkout will be displayed in. The options are 'iframe' or 'regular'. Choose 'iframe' if this is an iframe checkout. Mode defaults to 'regular'. */
	private Mode mode;