package org.onehippo.forge.konakart.hst.wizard.checkout.activity;
import com.konakart.app.KKException;
import com.konakart.appif.AddressIf;
import com.konakart.appif.ZoneIf;
import org.apache.commons.lang.StringUtils;
import org.hippoecm.hst.component.support.forms.FormField;
import org.onehippo.forge.konakart.hst.utils.KKActionsConstants;
import org.onehippo.forge.konakart.hst.utils.KKRegisterFormUtils;
import org.onehippo.forge.konakart.hst.wizard.ActivityException;
import org.onehippo.forge.konakart.hst.wizard.checkout.CheckoutSeedData;
import org.onehippo.forge.konakart.site.service.KKServiceHelper;
import java.util.ArrayList;
import java.util.List;
import static org.onehippo.forge.konakart.hst.utils.KKRegisterFormUtils.*;
import static org.onehippo.forge.konakart.hst.utils.KKUtil.checkMandatoryField;
public abstract class BaseAddressActivity extends BaseCheckoutActivity {
protected KKRegisterFormUtils registerFormUtils = new KKRegisterFormUtils();
@Override
public void doBeforeRender() throws ActivityException {
if (!validateCurrentCart()) {
return;
}
CheckoutSeedData seedData = (CheckoutSeedData) processorContext.getSeedData();
try {
seedData.getRequest().setAttribute(COUNTRIES,
KKServiceHelper.getKKEngineService().getKKAppEng(hstRequest).getAllCountries());
// Set the province if has been selected
FormField countryField = formMap.getField(COUNTRY);
if (countryField != null) {
int country = StringUtils.isNotBlank(countryField.getValue()) ? Integer.valueOf(countryField.getValue()) : -1;
ZoneIf[] zones = KKServiceHelper.getKKEngineService().getKKAppEng(hstRequest).getEng().getZonesPerCountry(country);
List<String> stateProvinces = new ArrayList<String>();
for (ZoneIf zone : zones) {
stateProvinces.add(zone.getZoneName());
}
seedData.getRequest().setAttribute(PROVINCES, stateProvinces);
}
} catch (KKException e) {
log.error("Failed to retrieve the list of provinces - {} ", e.toString());
}
// Initialize the list of addresses already created.
if (!seedData.getKkBaseHstComponent().isGuestCustomer(hstRequest)) {
try {
KKServiceHelper.getKKEngineService().getKKAppEng(hstRequest).getCustomerMgr().populateCurrentCustomerAddresses(/* force */ false);
AddressIf[] addresses = KKServiceHelper.getKKEngineService().getKKAppEng(hstRequest).getCustomerMgr().getCurrentCustomer().getAddresses();
seedData.getRequest().setAttribute(ADDRESSES, addresses);
} catch (Exception e) {
log.warn("Failed to load customer addresses - {}", e.toString());
}
}
}
@Override
public boolean doValidForm() {
super.doValidForm();
CheckoutSeedData seedData = (CheckoutSeedData) processorContext.getSeedData();
boolean result = true;
String errorMessage = seedData.getBundleAsString("checkout.mandatory.field");
if (seedData.getAction().equals(KKActionsConstants.ACTIONS.SELECT.name())) {
String addressId = formMap.getField(ADDRESS).getValue();
if (StringUtils.isNotEmpty(addressId) && !"-1".equals(addressId)) {
return result;
}
result = checkMandatoryField(formMap, GENDER, errorMessage);
result = result & checkMandatoryField(formMap, FIRSTNAME, errorMessage);
result = result & checkMandatoryField(formMap, LASTNAME, errorMessage);
result = result & checkMandatoryField(formMap, STREETADDRESS, errorMessage);
result = result & checkMandatoryField(formMap, POSTALCODE, errorMessage);
result = result & checkMandatoryField(formMap, CITY, errorMessage);
result = result & checkMandatoryField(formMap, STATEPROVINCE, errorMessage);
result = result & checkMandatoryField(formMap, COUNTRY, errorMessage);
if (isCheckoutAsRegister() || isCheckoutAsGuest()) {
result = result & checkMandatoryField(formMap, EMAIL, errorMessage);
result = result & checkMandatoryField(formMap, DATEOFBIRTH, errorMessage);
// Valid if the a customer has already this email
String emailAddress = formMap.getField(EMAIL).getValue();
try {
// Check if the email already exists
if (kkAppEng.getEng().doesCustomerExistForEmail(emailAddress)) {
String password = formMap.getField(PASSWORD).getValue();
// Try to logged-in
boolean isLoggedIn = KKServiceHelper.getKKEngineService().logIn(hstRequest, hstResponse, emailAddress, password);
if (!isLoggedIn) {
// login has failed
result = false;
addMessage(GLOBALMESSAGE, seedData.getBundleAsString("checkout.email.alreadyexits.field"));
}
}
} catch (KKException e) {
log.error("Failed to validate if the email set during the checkout process already exists.", e);
}
}
if (isCheckoutAsRegister()) {
result = result & checkMandatoryField(formMap, PASSWORD, errorMessage);
result = result & checkMandatoryField(formMap, PASSWORD_CONFIRMATION, errorMessage);
}
}
return result;
}
/**
* This method must be overrided if you implement a different onepagecheckout
*
* @return the onePageCheckout formMapFields
*/
public List<String> getCheckoutFormMapFields() {
return PARAMS;
}
}