package com.arcbees.gwtpwebsite.client.editor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import javax.inject.Inject;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import com.arcbees.gwtpwebsite.client.editor.components.CreditCardPresenter;
import com.arcbees.gwtpwebsite.client.event.FormUpdatedEvent;
import com.arcbees.gwtpwebsite.shared.domain.Order;
import com.arcbees.gwtpwebsite.shared.domain.Plan;
import com.google.inject.assistedinject.Assisted;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.HasUiHandlers;
import com.gwtplatform.mvp.client.PresenterWidget;
import com.gwtplatform.mvp.client.View;
public class OrderEditorPresenter extends PresenterWidget<OrderEditorPresenter.MyView> implements OrderEditorUiHandlers {
interface MyView extends View, HasUiHandlers<OrderEditorUiHandlers> {
Order flush();
void initialize(Order order);
void setConstraintViolations(Iterable<ConstraintViolation<?>> constraintViolations);
}
static final Object SLOT_CREDIT_CARD = new Object();
private final Plan plan;
private final CreditCardPresenter creditCardPresenter;
@Inject
OrderEditorPresenter(EventBus eventBus,
MyView view,
CreditCardPresenter creditCardPresenter,
@Assisted Plan plan) {
super(eventBus, view);
this.plan = plan;
this.creditCardPresenter = creditCardPresenter;
getView().setUiHandlers(this);
}
public Order getOrder() {
return getView().flush();
}
public Boolean isOrderValid() {
Order order = getView().flush();
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Order>> violations = validator.validate(order);
getView().setConstraintViolations(new ArrayList<ConstraintViolation<?>>(violations));
boolean isCreditCardValid = creditCardPresenter.validate();
boolean isOrderValid = violations.isEmpty() || onlyCardTokenIsNull(violations);
return isOrderValid && isCreditCardValid;
}
@Override
public void onBlur() {
fireEvent(new FormUpdatedEvent());
}
@Override
protected void onBind() {
super.onBind();
getView().initialize(order());
setInSlot(SLOT_CREDIT_CARD, creditCardPresenter);
}
private boolean onlyCardTokenIsNull(Set<ConstraintViolation<Order>> violations) {
boolean onlyCardTokenIsNull = false;
if (violations.size() == 1) {
Iterator<ConstraintViolation<Order>> iterator = violations.iterator();
ConstraintViolation<Order> violation = iterator.next();
if (violation.getPropertyPath().toString().equals("cardToken")) {
onlyCardTokenIsNull = true;
}
}
return onlyCardTokenIsNull;
}
private Order order() {
Order order = new Order();
order.setPlan(plan);
return order;
}
}