package com.salesmanager.admin.initialization;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.constants.SystemConstants;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.reference.init.InitializationDatabase;
import com.salesmanager.core.business.services.system.MerchantConfigurationService;
import com.salesmanager.core.business.services.system.SystemConfigurationService;
import com.salesmanager.core.business.services.user.GroupService;
import com.salesmanager.core.business.services.user.PermissionService;
import com.salesmanager.core.business.utils.CoreConfiguration;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.system.MerchantConfig;
import com.salesmanager.core.model.system.SystemConfiguration;
import com.salesmanager.core.model.user.Group;
import com.salesmanager.core.model.user.GroupType;
import com.salesmanager.core.model.user.Permission;
import com.salesmanager.admin.model.permission.Permissions;
import com.salesmanager.admin.model.permission.ShopPermission;
import com.salesmanager.admin.security.WebUserServices;
import com.salesmanager.admin.constants.ApplicationConstants;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.xml.transform.stream.StreamSource;
@Component
public class InitializationLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(InitializationLoader.class);
@Inject
private MerchantConfigurationService merchantConfigurationService;
@Inject
private InitializationDatabase initializationDatabase;
@Inject
private InitData initData;
@Inject
private SystemConfigurationService systemConfigurationService;
@Inject
private WebUserServices userDetailsService;
@Inject
protected PermissionService permissionService;
@Inject
protected GroupService groupService;
@Inject
private CoreConfiguration configuration;
@Inject
protected MerchantStoreService merchantService;
@Inject
private ObjectMapper jacksonObjectMapper;
@Inject
private ResourceLoader resourceLoader;
@PostConstruct
public void init() {
try {
if (initializationDatabase.isEmpty()) {
File permissionXML=resourceLoader.getResource("classpath:/permission/permission.json").getFile();
StreamSource xmlSource = new StreamSource(permissionXML);
//Permissions permissions= (Permissions) jaxb2Marshaller.unmarshal(xmlSource);
Permissions permissions= jacksonObjectMapper.readValue(permissionXML,Permissions.class);
//All default data to be created
LOGGER.info(String.format("%s : Shopizer database is empty, populate it....", "sm-shop"));
initializationDatabase.populate("sm-shop");
MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
//security groups and permissions
Map<String, Group> groupMap = new HashMap<String,Group>();
if(CollectionUtils.isNotEmpty(permissions.getShopPermission())){
for(ShopPermission shopPermission : permissions.getShopPermission()){
Permission permission = new Permission(shopPermission.getType());
for(String groupName: shopPermission.getShopGroup().getName()){
if(groupMap.get(groupName) == null){
Group group = new Group(groupName);
group.setGroupType(GroupType.ADMIN);
groupService.create(group);
groupMap.put(groupName,group);
permission.getGroups().add(group);
}
else{
permission.getGroups().add(groupMap.get(groupName)) ;
}
permissionService.create( permission);
}
}
}
userDetailsService.createDefaultAdmin();
MerchantConfig config = new MerchantConfig();
config.setAllowPurchaseItems(true);
config.setDisplayAddToCartOnFeaturedItems(true);
merchantConfigurationService.saveMerchantConfig(config, store);
loadData();
}
} catch (Exception e) {
LOGGER.error("Error in the init method",e);
}
}
private void loadData() throws ServiceException {
String loadTestData = configuration.getProperty(ApplicationConstants.POPULATE_TEST_DATA);
boolean loadData = !StringUtils.isBlank(loadTestData) && loadTestData.equals(SystemConstants.CONFIG_VALUE_TRUE);
if(loadData) {
SystemConfiguration configuration = systemConfigurationService.getByKey(ApplicationConstants.TEST_DATA_LOADED);
if(configuration!=null) {
if(configuration.getKey().equals(ApplicationConstants.TEST_DATA_LOADED)) {
if(configuration.getValue().equals(SystemConstants.CONFIG_VALUE_TRUE)) {
return;
}
}
}
initData.initInitialData();
configuration = new SystemConfiguration();
configuration.getAuditSection().setModifiedBy(SystemConstants.SYSTEM_USER);
configuration.setKey(ApplicationConstants.TEST_DATA_LOADED);
configuration.setValue(SystemConstants.CONFIG_VALUE_TRUE);
systemConfigurationService.create(configuration);
}
}
}