package com.salesmanager.core.business.services.reference.init;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.reference.country.CountryService;
import com.salesmanager.core.business.services.reference.currency.CurrencyService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.services.reference.loader.IntegrationModulesLoader;
import com.salesmanager.core.business.services.reference.loader.ZonesLoader;
import com.salesmanager.core.business.services.reference.zone.ZoneService;
import com.salesmanager.core.business.services.system.ModuleConfigurationService;
import com.salesmanager.core.business.services.tax.TaxClassService;
import com.salesmanager.core.constants.SchemaConstant;
import com.salesmanager.core.model.catalog.product.type.ProductType;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.country.Country;
import com.salesmanager.core.model.reference.country.CountryDescription;
import com.salesmanager.core.model.reference.currency.Currency;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.reference.zone.Zone;
import com.salesmanager.core.model.reference.zone.ZoneDescription;
import com.salesmanager.core.model.system.IntegrationModule;
import com.salesmanager.core.model.tax.taxclass.TaxClass;
@Service("initializationDatabase")
public class InitializationDatabaseImpl implements InitializationDatabase {
private static final Logger LOGGER = LoggerFactory.getLogger(InitializationDatabaseImpl.class);
@Inject
private ZoneService zoneService;
@Inject
private LanguageService languageService;
@Inject
private CountryService countryService;
@Inject
private CurrencyService currencyService;
@Inject
protected MerchantStoreService merchantService;
@Inject
protected ProductTypeService productTypeService;
@Inject
private TaxClassService taxClassService;
@Inject
private ZonesLoader zonesLoader;
@Inject
private IntegrationModulesLoader modulesLoader;
@Inject
private ModuleConfigurationService moduleConfigurationService;
private String name;
public boolean isEmpty() {
return languageService.count() == 0;
}
@Transactional
public void populate(String contextName) throws ServiceException {
this.name = contextName;
createLanguages();
createCountries();
createZones();
createCurrencies();
createSubReferences();
createModules();
createMerchant();
}
private void createCurrencies() throws ServiceException {
LOGGER.info(String.format("%s : Populating Currencies ", name));
//Locale [] locales = Locale.getAvailableLocales();
//Locale l = locales[0];
for (String code : SchemaConstant.CURRENCY_MAP.keySet()) {
try {
java.util.Currency c = java.util.Currency.getInstance(code);
if(c==null) {
LOGGER.info(String.format("%s : Populating Currencies : no currency for code : %s", name, code));
}
//check if it exist
Currency currency = new Currency();
currency.setName(c.getCurrencyCode());
currency.setCurrency(c);
currencyService.create(currency);
//System.out.println(l.getCountry() + " " + c.getSymbol() + " " + c.getSymbol(l));
} catch (IllegalArgumentException e) {
LOGGER.info(String.format("%s : Populating Currencies : no currency for code : %s", name, code));
}
}
}
private void createCountries() throws ServiceException {
LOGGER.info(String.format("%s : Populating Countries ", name));
List<Language> languages = languageService.list();
for(String code : SchemaConstant.COUNTRY_ISO_CODE) {
Locale locale = SchemaConstant.LOCALES.get(code);
if (locale != null) {
Country country = new Country(code);
countryService.create(country);
for (Language language : languages) {
String name = locale.getDisplayCountry(new Locale(language.getCode()));
CountryDescription description = new CountryDescription(language, name);
countryService.addCountryDescription(country, description);
}
}
}
}
private void createZones() throws ServiceException {
LOGGER.info(String.format("%s : Populating Zones ", name));
try {
Map<String,Zone> zonesMap = new HashMap<String,Zone>();
zonesMap = zonesLoader.loadZones("reference/zoneconfig.json");
for (Map.Entry<String, Zone> entry : zonesMap.entrySet()) {
String key = entry.getKey();
Zone value = entry.getValue();
if(value.getDescriptions()==null) {
LOGGER.warn("This zone " + key + " has no descriptions");
continue;
}
List<ZoneDescription> zoneDescriptions = value.getDescriptions();
value.setDescriptons(null);
zoneService.create(value);
for(ZoneDescription description : zoneDescriptions) {
description.setZone(value);
zoneService.addDescription(value, description);
}
}
} catch (Exception e) {
throw new ServiceException(e);
}
}
private void createLanguages() throws ServiceException {
LOGGER.info(String.format("%s : Populating Languages ", name));
for(String code : SchemaConstant.LANGUAGE_ISO_CODE) {
Language language = new Language(code);
languageService.create(language);
}
}
private void createMerchant() throws ServiceException {
LOGGER.info(String.format("%s : Creating merchant ", name));
Date date = new Date(System.currentTimeMillis());
Language en = languageService.getByCode("en");
Country ca = countryService.getByCode("CA");
Currency currency = currencyService.getByCode("CAD");
Zone qc = zoneService.getByCode("QC", ca);
List<Language> supportedLanguages = new ArrayList<Language>();
supportedLanguages.add(en);
//create a merchant
MerchantStore store = new MerchantStore();
store.setCountry(ca);
store.setCurrency(currency);
store.setDefaultLanguage(en);
store.setInBusinessSince(date);
store.setZone(qc);
store.setStorename("Default store");
store.setStorephone("888-888-8888");
store.setCode(MerchantStore.DEFAULT_STORE);
store.setStorecity("My city");
store.setStoreaddress("1234 Street address");
store.setStorepostalcode("H2H-2H2");
store.setStoreEmailAddress("test@test.com");
store.setDomainName("localhost:8080");
store.setStoreTemplate("bootstrap");
store.setLanguages(supportedLanguages);
merchantService.create(store);
TaxClass taxclass = new TaxClass(TaxClass.DEFAULT_TAX_CLASS);
taxclass.setMerchantStore(store);
taxClassService.create(taxclass);
}
private void createModules() throws ServiceException {
try {
List<IntegrationModule> modules = modulesLoader.loadIntegrationModules("reference/integrationmodules.json");
for (IntegrationModule entry : modules) {
moduleConfigurationService.create(entry);
}
} catch (Exception e) {
throw new ServiceException(e);
}
}
private void createSubReferences() throws ServiceException {
LOGGER.info(String.format("%s : Loading catalog sub references ", name));
ProductType productType = new ProductType();
productType.setCode(ProductType.GENERAL_TYPE);
productTypeService.create(productType);
}
}