/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */
 package org.eclipse.osbp.xtext.i18n;

import static com.google.common.collect.Sets.newHashSet;

import java.util.Set;

import org.eclipse.xtext.Constants;
import org.eclipse.xtext.generator.IFileSystemAccess;
import org.eclipse.xtext.generator.IOutputConfigurationProvider;
import org.eclipse.xtext.generator.OutputConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Inject;
import com.google.inject.name.Named;

public class DSLOutputConfigurationProvider implements IOutputConfigurationProvider {
	@Inject
	@Named(Constants.FILE_EXTENSIONS)
	private String extensions;
	private static final Logger LOGGER = LoggerFactory.getLogger(DSLOutputConfigurationProvider.class);

	public static final String SMOOKS_OUTPUT_ONCE = "DEFAULT_OUTPUT_ONCE";
	public static final String SMOOKS_OUTPUT_DIRECTORY = "smooks";
	public static final String DEFAULT_OUTPUT_I18N = "DEFAULT_OUTPUT_I18N";
	public static final String I18N_OUTPUT_DIRECTORY = "i18n";
	public static final String DEFAULT_REPORT_OUTPUT = "DEFAULT_REPORT_OUTPUT";
	public static final String CUBE_CATALOG_OUTPUT = "CUBE_CATALOG_OUTPUT";
	public static final String CUBE_CATALOG_DIRECTORY = "catalog";
	public static final String CONFIGURATION_DIRECTORY = "config";
	public static final boolean NAMEDDEFAULTDIRECTORY = false;
	
	@Override
	public Set<OutputConfiguration> getOutputConfigurations() {
		Set<OutputConfiguration> configs = newHashSet();

		OutputConfiguration defaultOutput = new OutputConfiguration(IFileSystemAccess.DEFAULT_OUTPUT);
		defaultOutput.setDescription("Output Folder");
		if(!NAMEDDEFAULTDIRECTORY || extensions == null) {
			defaultOutput.setOutputDirectory("./src-gen");
		} else {
			defaultOutput.setOutputDirectory("./src-"+extensions);
		}
		defaultOutput.setOverrideExistingResources(true);
		defaultOutput.setCreateOutputDirectory(true);
		defaultOutput.setCleanUpDerivedResources(true);
		defaultOutput.setSetDerivedProperty(true);
		defaultOutput.setKeepLocalHistory(true);
		configs.add(defaultOutput);
//		LOGGER.debug("default:{}", defaultOutput);

		OutputConfiguration onceOutput = new OutputConfiguration(SMOOKS_OUTPUT_ONCE);
	    onceOutput.setDescription("Output Folder (once)");
	    onceOutput.setOutputDirectory("./"+SMOOKS_OUTPUT_DIRECTORY);
	    onceOutput.setOverrideExistingResources(true);
	    onceOutput.setCreateOutputDirectory(true);
	    onceOutput.setCleanUpDerivedResources(true);
	    onceOutput.setSetDerivedProperty(true);
		configs.add(onceOutput);
//		LOGGER.debug("smooks:{}", onceOutput);
	    
		OutputConfiguration catalogOutput = new OutputConfiguration(CUBE_CATALOG_OUTPUT);
		catalogOutput.setDescription("Output Folder (catalog)");
		catalogOutput.setOutputDirectory("./"+CUBE_CATALOG_DIRECTORY);
		catalogOutput.setOverrideExistingResources(true);
		catalogOutput.setCreateOutputDirectory(true);
		catalogOutput.setCleanUpDerivedResources(true);
		catalogOutput.setSetDerivedProperty(true);
		configs.add(catalogOutput);
//		LOGGER.debug("cube:{}", catalogOutput);
		
	    OutputConfiguration resourceOutput = new OutputConfiguration(DEFAULT_OUTPUT_I18N);
	    resourceOutput.setDescription("Output Folder (i18n)");
		if(!NAMEDDEFAULTDIRECTORY || extensions == null) {
			resourceOutput.setOutputDirectory("./"+I18N_OUTPUT_DIRECTORY);
		} else {
			resourceOutput.setOutputDirectory("./"+I18N_OUTPUT_DIRECTORY+"_"+extensions);
		}
	    resourceOutput.setOverrideExistingResources(true);
	    resourceOutput.setCreateOutputDirectory(true);
	    resourceOutput.setCleanUpDerivedResources(false);
	    resourceOutput.setSetDerivedProperty(false);
		configs.add(resourceOutput);
//		LOGGER.debug("i18n:{}", resourceOutput);

		OutputConfiguration reportOutput = new OutputConfiguration(DEFAULT_REPORT_OUTPUT);
		reportOutput.setDescription("Output Folder");
		reportOutput.setOutputDirectory("./rptdesign-gen");
		reportOutput.setOverrideExistingResources(true);
		reportOutput.setCreateOutputDirectory(true);
		reportOutput.setCleanUpDerivedResources(true);
		reportOutput.setSetDerivedProperty(true);
		configs.add(reportOutput);
//		LOGGER.debug("report:{}", reportOutput);

		OutputConfiguration dtoOutput = new OutputConfiguration("DTOs");
		dtoOutput.setDescription("derived DTOs");
		dtoOutput.setOutputDirectory("./dto-models");
		dtoOutput.setOverrideExistingResources(false);
		dtoOutput.setCreateOutputDirectory(true);
		dtoOutput.setCleanUpDerivedResources(false);
		dtoOutput.setSetDerivedProperty(false);
		dtoOutput.setKeepLocalHistory(true);
		configs.add(dtoOutput);
//		LOGGER.debug("dto:{}", dtoOutput);
		
		OutputConfiguration dtoMapperOutput = new OutputConfiguration(
				"Dto-Mappers");
		dtoMapperOutput.setDescription("Dto Mappers");
		if(!NAMEDDEFAULTDIRECTORY) {
			dtoMapperOutput.setOutputDirectory("./src-gen");
		} else {
			dtoMapperOutput.setOutputDirectory("./src-mappers");
		}
		dtoMapperOutput.setOverrideExistingResources(true);
		dtoMapperOutput.setCreateOutputDirectory(true);
		dtoMapperOutput.setCleanUpDerivedResources(true);
		dtoMapperOutput.setSetDerivedProperty(true);
		dtoMapperOutput.setKeepLocalHistory(true);
		configs.add(dtoMapperOutput);
//		LOGGER.debug("dtoMapper:{}", dtoMapperOutput);

		OutputConfiguration servicesOutput = new OutputConfiguration(
				"Services-DSL");
		servicesOutput.setDescription("Services-DSL");
		servicesOutput.setOutputDirectory("./service-models");
		servicesOutput.setOverrideExistingResources(true);
		servicesOutput.setCreateOutputDirectory(true);
		servicesOutput.setCleanUpDerivedResources(true);
		servicesOutput.setSetDerivedProperty(true);
		servicesOutput.setKeepLocalHistory(true);
		configs.add(servicesOutput);
//		LOGGER.debug("service:{}", servicesOutput);
		
		OutputConfiguration binOutput = new OutputConfiguration(
				"ModelBin");
		binOutput.setDescription("ModelBin");
		binOutput.setOutputDirectory("./modelsbin");
		binOutput.setOverrideExistingResources(true);
		binOutput.setCreateOutputDirectory(true);
		binOutput.setCleanUpDerivedResources(true);
		binOutput.setSetDerivedProperty(true);
		binOutput.setKeepLocalHistory(true);
		configs.add(binOutput);
//		LOGGER.debug("modelbin:{}", binOutput);

		OutputConfiguration configOutput = new OutputConfiguration(CONFIGURATION_DIRECTORY);
	    configOutput.setDescription("Configuration Folder (once)");
	    configOutput.setOutputDirectory("./"+CONFIGURATION_DIRECTORY);
	    configOutput.setOverrideExistingResources(false);
	    configOutput.setCreateOutputDirectory(true);
	    configOutput.setCleanUpDerivedResources(false);
	    configOutput.setSetDerivedProperty(false);
		configs.add(configOutput);
//		LOGGER.debug("configuration:{}", configOutput);

		OutputConfiguration xmiOutput = new OutputConfiguration("xmi");
		xmiOutput.setDescription("xmi");
		xmiOutput.setOutputDirectory("./modelsbin");
		xmiOutput.setOverrideExistingResources(true);
		xmiOutput.setCreateOutputDirectory(true);
		xmiOutput.setCleanUpDerivedResources(true);
		xmiOutput.setSetDerivedProperty(true);
		xmiOutput.setKeepLocalHistory(true);
		configs.add(xmiOutput);
//		LOGGER.debug("xmi:{}", xmiOutput);

		OutputConfiguration ecviewOutput = new OutputConfiguration("Autowire-ECViews");
		ecviewOutput.setDescription("Autowired ECViews");
		ecviewOutput.setOutputDirectory("./ecviews");
		ecviewOutput.setOverrideExistingResources(true);
		ecviewOutput.setCreateOutputDirectory(true);
		ecviewOutput.setCleanUpDerivedResources(true);
		ecviewOutput.setSetDerivedProperty(true);
		ecviewOutput.setKeepLocalHistory(true);
		configs.add(ecviewOutput);
//		LOGGER.debug("ecviews:{}", ecviewOutput);

		OutputConfiguration componentOutput = new OutputConfiguration("OSGI-INF");
		componentOutput.setDescription("OSGi-Services");
		componentOutput.setOutputDirectory("./OSGI-INF");
		componentOutput.setOverrideExistingResources(true);
		componentOutput.setCreateOutputDirectory(true);
		componentOutput.setCleanUpDerivedResources(true);
		componentOutput.setSetDerivedProperty(true);
		componentOutput.setKeepLocalHistory(true);
		configs.add(componentOutput);
//		LOGGER.debug("osgi:{}", componentOutput);

		return configs;
	}
}
