package org.dicadeveloper.weplantaforest.cart;
import java.beans.PropertyEditorSupport;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Transient;
import org.dicadeveloper.weplantaforest.abo.Abo;
import org.dicadeveloper.weplantaforest.code.Code;
import org.dicadeveloper.weplantaforest.event.Event;
import org.dicadeveloper.weplantaforest.payment.PaymentData;
import org.dicadeveloper.weplantaforest.receipt.Receipt;
import org.dicadeveloper.weplantaforest.trees.Tree;
import org.dicadeveloper.weplantaforest.user.User;
import org.dicadeveloper.weplantaforest.views.Views;
import org.hibernate.annotations.Cascade;
import org.springframework.hateoas.Identifiable;
import com.fasterxml.jackson.annotation.JsonView;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Entity
@Getter
@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor
public class Cart implements Identifiable<Long> {
public static class Editor extends PropertyEditorSupport {
@Override
public void setAsText(final String text) throws IllegalArgumentException {
}
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "_cartId")
@JsonView(Views.ShortCart.class)
private Long id;
@Column(name = "_timeStamp")
@JsonView(Views.ShortCart.class)
private Long timeStamp;
@Enumerated(EnumType.STRING)
@Column(name = "_cartState")
private CartState cartState;
@OneToMany(mappedBy = "cart", fetch = FetchType.EAGER)
@Cascade({ org.hibernate.annotations.CascadeType.ALL })
private List<CartItem> cartItems = new ArrayList<CartItem>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "_buyer__userId")
private User buyer;
@ManyToOne
@JoinColumn(name = "_event__id")
private Event event;
@Column(name = "_callbackParams", length = 1024)
private String callbackParams;
@Column(name = "_callBackVzid", length = 32)
private String callBackVzid;
@Column(name = "_callBackStrasse", length = 32)
private String callBackStrasse;
@Column(name = "_callBackTimestamp", length = 32)
private String callBackTimestamp;
@Column(name = "_callBackFirma", length = 256)
private String callBackFirma;
@Column(name = "_callBackBanktransactionid", length = 32)
private String callBackBanktransactionid;
@Column(name = "_callBackVorname", length = 128)
private String callBackVorname;
@Column(name = "_callBackPlz", length = 16)
private String callBackPlz;
@Column(name = "_callBackStatus", length = 32)
private String callBackStatus;
@Column(name = "_callBackNachname", length = 128)
private String callBackNachname;
@Column(name = "_callBackOrt", length = 128)
private String callBackOrt;
@Column(name = "_callBackBetrag", length = 16)
private String callBackBetrag;
@Column(name = "_callBackLand", length = 16)
private String callBackLand;
@Column(name = "_callBackEmail", length = 256)
private String callBackEmail;
@Column(name = "_callBackTrackingcode", length = 32)
private String callBackTrackingcode;
@Column(name = "_callBackTransactionid", length = 64)
private String callBackTransactionid;
@Column(name = "_callBackOid", length = 32)
private String callBackOid;
@Column(name = "_callBackMethod", length = 128)
private String callBackMethod;
@Column(name = "_callBackZahlungsart", length = 32)
private String callBackZahlungsart;
@Column(name = "_callBackFirmanzusatz", length = 256)
private String callBackFirmanzusatz;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "_abo__id", nullable = true)
private Abo abo;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "_receipt__receiptId")
private Receipt receipt;
@OneToOne(optional = true)
@JoinColumn(name = "_code__id")
private Code code;
@Transient
private boolean gift = false;
/**
* Target price in case this card was generated for an price based code.
*/
@Column(name = "_targetedPrice")
private float targetedPrice;
public CartItem removeCartItem(final Long articleId) {
for (final CartItem item : cartItems) {
if (item.getTree()
.getProjectArticle()
.getArticleId()
.equals(articleId)) {
cartItems.remove(item);
return item;
}
}
return null;
}
public void addCartItem(final CartItem cartItem) {
if (!containsCartItem(cartItem)) {
cartItems.add(cartItem);
cartItem.setCart(this);
}
}
public boolean containsCartItem(final CartItem cartItem) {
for (final CartItem item : cartItems) {
if (item.getTree()
.getProjectArticle()
.getArticleId()
.equals(cartItem.getTree()
.getProjectArticle()
.getArticleId())) {
return true;
}
}
return false;
}
public void removeCartItem(final CartItem cartItem) {
cartItems.remove(cartItem);
}
public boolean isFilled() {
return !cartItems.isEmpty();
}
public Date getTimeStampAsDate() {
return new Date(timeStamp);
}
@Transient
@JsonView(Views.ShortCart.class)
public int getTreeCount() {
int count = 0;
for (Tree tree : getTrees()) {
count += tree.getAmount();
}
return count;
}
@Transient
@JsonView(Views.ShortCart.class)
public BigDecimal getTotalPrice() {
BigDecimal total = new BigDecimal(0.00);
for (final CartItem item : cartItems) {
total = total.add(item.getTotalPrice());
}
return total;
}
@Transient
public List<Long> getPlantArticleIds() {
final List<Long> ids = new ArrayList<Long>();
for (Tree tree : getTrees()) {
ids.add(tree.getProjectArticle()
.getArticleId());
}
return ids;
}
@Transient
public List<Tree> getTrees() {
final List<Tree> trees = new ArrayList<Tree>();
for (final CartItem item : cartItems) {
if(item.getTree() != null){
trees.add(item.getTree());
}
}
return trees;
}
public Date getCallBackTimestampAsDate() {
if (callBackTimestamp == null) {
return null;
}
return new Date(Long.parseLong(callBackTimestamp) * 1000); // its php,
// sec since
// 1970, not
// msec
}
public void setCallBackValuesAndStateToCallBack(PaymentData paymentData){
setCartState(CartState.CALLBACK);
setCallBackBetrag(String.valueOf(getTotalPrice().doubleValue()));
setCallBackEmail(paymentData.getMail());
setCallBackFirma(paymentData.getCompany());
setCallBackFirmanzusatz(paymentData.getCompanyAddon());
setCallBackLand(paymentData.getCountry());
setCallBackNachname(paymentData.getName());
setCallBackOrt(paymentData.getCity());
setCallBackPlz(paymentData.getZip());
setCallBackStrasse(paymentData.getStreet());
setCallBackTrackingcode(getId().toString());
setCallBackVorname(paymentData.getForename());
setCallBackZahlungsart(paymentData.getPaymentMethod());
}
public void setCallBackValues(PaymentData paymentData){
setCallBackBetrag(String.valueOf(getTotalPrice().doubleValue()));
setCallBackEmail(paymentData.getMail());
setCallBackFirma(paymentData.getCompany());
setCallBackFirmanzusatz(paymentData.getCompanyAddon());
setCallBackLand(paymentData.getCountry());
setCallBackNachname(paymentData.getName());
setCallBackOrt(paymentData.getCity());
setCallBackPlz(paymentData.getZip());
setCallBackStrasse(paymentData.getStreet());
setCallBackTrackingcode(getId().toString());
setCallBackVorname(paymentData.getForename());
setCallBackZahlungsart(paymentData.getPaymentMethod());
}
}