package com.salesmanager.shop.store.controller.category.facade;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.services.catalog.category.CategoryService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.model.catalog.category.Category;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.model.catalog.category.PersistableCategory;
import com.salesmanager.shop.model.catalog.category.ReadableCategory;
import com.salesmanager.shop.populator.catalog.PersistableCategoryPopulator;
import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.inject.Inject;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Service( value = "categoryFacade" )
public class CategoryFacadeImpl implements CategoryFacade {
@Inject
private CategoryService categoryService;
@Inject
private LanguageService languageService;
@Override
public List<ReadableCategory> getCategoryHierarchy(MerchantStore store,
int depth, Language language) throws Exception {
List<Category> categories = categoryService.listByDepth(store, depth, language);
List<ReadableCategory> returnValues = new ArrayList<ReadableCategory>();
Map<Long, ReadableCategory> categoryMap = new ConcurrentHashMap<Long, ReadableCategory>();
ReadableCategoryPopulator categoryPopulator = new ReadableCategoryPopulator();
for(Category category : categories) {
if(category.isVisible()) {
ReadableCategory readableCategory = new ReadableCategory();
categoryPopulator.populate(category, readableCategory, store, language);
returnValues.add(readableCategory);
categoryMap.put(category.getId(), readableCategory);
}
}
for(ReadableCategory category : returnValues) {
if(category.isVisible()) {
if(category.getParent()!=null) {
ReadableCategory parentCategory = categoryMap.get(category.getParent().getId());
if(parentCategory!=null) {
parentCategory.getChildren().add(category);
}
}
}
}
returnValues = new ArrayList<ReadableCategory>();
for(Object obj : categoryMap.values()) {
ReadableCategory readableCategory = (ReadableCategory)obj;
if(readableCategory.getDepth()==0) {//only from root
returnValues.add(readableCategory);
}
}
Collections.sort(returnValues, new Comparator<ReadableCategory>() {
@Override
public int compare(final ReadableCategory firstCategory, final ReadableCategory secondCategory) {
return firstCategory.getSortOrder() - secondCategory.getSortOrder();
}
} );
return returnValues;
}
@Override
public void saveCategory(MerchantStore store, PersistableCategory category)
throws Exception {
PersistableCategoryPopulator populator = new PersistableCategoryPopulator();
populator.setCategoryService(categoryService);
populator.setLanguageService(languageService);
Category dbCategory = populator.populate(category, new Category(), store, store.getDefaultLanguage());
this.saveCategory(store, dbCategory, null);
}
private void saveCategory(MerchantStore store, Category c, Category parent) throws ServiceException {
/**
c.children1
children1.children1
children1.children2
children1.children2.children1
**/
/** set lineage **/
if(parent!=null) {
c.setParent(c);
String lineage = parent.getLineage();
int depth = parent.getDepth();
c.setDepth(depth+1);
c.setLineage(new StringBuilder().append(lineage).append(parent.getId()).append("/").toString());
}
c.setMerchantStore(store);
//remove children
List<Category> children = c.getCategories();
c.setCategories(null);
/** set parent **/
if(parent!=null) {
c.setParent(parent);
}
categoryService.saveOrUpdate(c);
if(!CollectionUtils.isEmpty(children)) {
parent = c;
for(Category sub : children) {
this.saveCategory(store, sub, parent);
}
}
}
}