/**
 *                                                                            
 *  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 v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 *
 */
 
package org.eclipse.osbp.xtext.gridsource.generator

import com.google.inject.Inject
import java.io.StringWriter
import java.io.Writer
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.util.EcoreUtil
import org.eclipse.emf.ecore.xmi.XMLResource
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.generator.IGenerator
import org.eclipse.osbp.infogrid.model.gridsource.CxGridSource
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropStyle

import static extension org.eclipse.osbp.infogrid.model.gridsource.util.Util.*

/**
 * Generates code from your model files on save.
 * 
 * see http://www.eclipse.org/Xtext/documentation.html#TutorialCodeGeneration
 */
class GridSourceGenerator implements IGenerator {

	override void doGenerate(Resource resource, IFileSystemAccess fsa) {
		resource.toBinary(fsa)
	}

	def toBinary(Resource input, IFileSystemAccess fsa) {
		val XMLResource outputRes = new XMLResourceImpl
		val CxGridSource lModel = input.contents.get(0) as CxGridSource

		// set required inputs
		lModel.rootTypeFQN = lModel.rootType.qualifiedName
		for (inputDef : lModel.inputs) {
			inputDef.inputTypeFQN = inputDef.inputType.qualifiedName
			for (filter : inputDef.filters) {
				filter.inputTypePropertyPath.dotPath = filter.inputTypePropertyPath.calcDotPath
				filter.rootTypePropertyPath.dotPath = filter.rootTypePropertyPath.calcDotPath
			}
		}

		// set required properties
		for (prop : lModel.properties) {
			prop.dotPath = prop.calcDotPath
			
			// prepare dot path in styles
			prop.style.prepare
		}

		val copy = EcoreUtil.copy(lModel)
		outputRes.contents += copy

		val Writer writer = new StringWriter
		outputRes.save(writer, null)

		fsa.generateFile(input.URI.lastSegment + ".gridsource_xmi", "xmi", writer.toString)
	}

	def dispatch void prepare(CxGridPropStyle style) {
	}

	def dispatch void prepare(CxGridPropPriceStyle style) {
		style.valuePropertyDotPath = style.valuePropertyPath.calcDotPath
		style.currencyPropertyDotPath = style.currencyPropertyPath.calcDotPath
	}

	def dispatch void prepare(CxGridPropQuantityStyle style) {
		style.valuePropertyDotPath = style.valuePropertyPath.calcDotPath
		style.uomPropertyDotPath = style.uomPropertyPath.calcDotPath
	}

}
