package com.salesmanager.shop.populator.catalog;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang3.StringUtils;
import com.salesmanager.core.business.constants.Constants;
import com.salesmanager.core.business.exception.ConversionException;
import com.salesmanager.core.business.services.catalog.product.PricingService;
import com.salesmanager.core.business.utils.AbstractDataPopulator;
import com.salesmanager.core.model.catalog.category.Category;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
import com.salesmanager.core.model.catalog.product.description.ProductDescription;
import com.salesmanager.core.model.catalog.product.image.ProductImage;
import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
import com.salesmanager.core.model.catalog.product.price.FinalPrice;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.model.catalog.ReadableImage;
import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
import com.salesmanager.shop.model.catalog.product.ReadableProduct;
import com.salesmanager.shop.utils.ImageFilePath;
public class ReadableProductPopulator extends
AbstractDataPopulator<Product, ReadableProduct> {
private PricingService pricingService;
private ImageFilePath imageUtils;
public ImageFilePath getimageUtils() {
return imageUtils;
}
public void setimageUtils(ImageFilePath imageUtils) {
this.imageUtils = imageUtils;
}
public PricingService getPricingService() {
return pricingService;
}
public void setPricingService(PricingService pricingService) {
this.pricingService = pricingService;
}
@Override
public ReadableProduct populate(Product source,
ReadableProduct target, MerchantStore store, Language language)
throws ConversionException {
Validate.notNull(pricingService, "Requires to set PricingService");
Validate.notNull(imageUtils, "Requires to set imageUtils");
try {
ProductDescription description = source.getProductDescription();
target.setId(source.getId());
target.setAvailable(source.isAvailable());
target.setProductHeight(source.getProductHeight());
target.setProductLength(source.getProductLength());
target.setProductWeight(source.getProductWeight());
target.setProductWidth(source.getProductWidth());
target.setPreOrder(source.isPreOrder());
target.setRefSku(source.getRefSku());
target.setSortOrder(source.getSortOrder());
if(source.getProductReviewAvg()!=null) {
double avg = source.getProductReviewAvg().doubleValue();
double rating = Math.round(avg * 2) / 2.0f;
target.setRating(rating);
}
target.setProductVirtual(source.getProductVirtual());
if(source.getProductReviewCount()!=null) {
target.setRatingCount(source.getProductReviewCount().intValue());
}
if(description!=null) {
com.salesmanager.shop.model.catalog.product.ProductDescription tragetDescription = new com.salesmanager.shop.model.catalog.product.ProductDescription();
tragetDescription.setFriendlyUrl(description.getSeUrl());
tragetDescription.setName(description.getName());
if(!StringUtils.isBlank(description.getMetatagTitle())) {
tragetDescription.setTitle(description.getMetatagTitle());
} else {
tragetDescription.setTitle(description.getName());
}
tragetDescription.setMetaDescription(description.getMetatagDescription());
tragetDescription.setDescription(description.getDescription());
tragetDescription.setHighlights(description.getProductHighlight());
target.setDescription(tragetDescription);
}
if(source.getManufacturer()!=null) {
ManufacturerDescription manufacturer = source.getManufacturer().getDescriptions().iterator().next();
ReadableManufacturer manufacturerEntity = new ReadableManufacturer();
com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription d = new com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription();
d.setName(manufacturer.getName());
manufacturerEntity.setDescription(d);
manufacturerEntity.setId(manufacturer.getId());
manufacturerEntity.setOrder(source.getManufacturer().getOrder());
manufacturerEntity.setCode(source.getManufacturer().getCode());
target.setManufacturer(manufacturerEntity);
}
ProductImage image = source.getProductImage();
if(image!=null) {
ReadableImage rimg = new ReadableImage();
rimg.setImageName(image.getProductImage());
String contextPath = imageUtils.getContextPath();
StringBuilder imagePath = new StringBuilder();
imagePath.append(contextPath).append(imageUtils.buildProductImageUtils(store, source.getSku(), image.getProductImage()));
rimg.setImageUrl(imagePath.toString());
rimg.setId(image.getId());
target.setImage(rimg);
//other images
Set<ProductImage> images = source.getImages();
if(images!=null && images.size()>0) {
List<ReadableImage> imageList = new ArrayList<ReadableImage>();
for(ProductImage img : images) {
ReadableImage prdImage = new ReadableImage();
prdImage.setImageName(img.getProductImage());
StringBuilder imgPath = new StringBuilder();
imgPath.append(contextPath).append(imageUtils.buildProductImageUtils(store, source.getSku(), img.getProductImage()));
prdImage.setImageUrl(imgPath.toString());
prdImage.setId(img.getId());
prdImage.setImageType(img.getImageType());
if(img.getProductImageUrl()!=null){
prdImage.setExternalUrl(img.getProductImageUrl());
}
if(img.getImageType()==1 && img.getProductImageUrl()!=null) {//video
prdImage.setVideoUrl(img.getProductImageUrl());
}
imageList.add(prdImage);
}
target
.setImages(imageList);
}
}
//remove products from invisible category -> set visible = false
/* Set<Category> categories = source.getCategories();
boolean isVisible = true;
if(!CollectionUtils.isEmpty(categories)) {
for(Category c : categories) {
if(c.isVisible()) {
isVisible = true;
break;
} else {
isVisible = false;
}
}
}*/
//target.setVisible(isVisible);
target.setSku(source.getSku());
//target.setLanguage(language.getCode());
FinalPrice price = pricingService.calculateProductPrice(source);
target.setFinalPrice(pricingService.getDisplayAmount(price.getFinalPrice(), store));
target.setPrice(price.getFinalPrice());
if(price.isDiscounted()) {
target.setDiscounted(true);
target.setOriginalPrice(pricingService.getDisplayAmount(price.getOriginalPrice(), store));
}
//availability
for(ProductAvailability availability : source.getAvailabilities()) {
if(availability.getRegion().equals(Constants.ALL_REGIONS)) {//TODO REL 2.1 accept a region
target.setQuantity(availability.getProductQuantity());
target.setQuantityOrderMaximum(availability.getProductQuantityOrderMax());
target.setQuantityOrderMinimum(availability.getProductQuantityOrderMin());
if(availability.getProductQuantity().intValue() > 0 && target.isAvailable()) {
target.setCanBePurchased(true);
}
}
}
return target;
} catch (Exception e) {
throw new ConversionException(e);
}
}
@Override
protected ReadableProduct createTarget() {
// TODO Auto-generated method stub
return null;
}
}