/**
 *                                                                            
 *  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.utils.common

import org.eclipse.xtext.common.types.JvmType
import org.eclipse.osbp.dsl.semantic.dto.LDto
import org.eclipse.osbp.dsl.semantic.dto.OSBPDtoPackage
import org.eclipse.osbp.dsl.semantic.entity.LEntity
import org.eclipse.osbp.dsl.semantic.common.types.LEnum
import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage
import org.eclipse.osbp.dsl.semantic.dto.util.NamingConventionsUtil
import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage
import org.eclipse.emf.ecore.EObject
import org.eclipse.osbp.dsl.semantic.entity.LBean
import org.eclipse.emf.ecore.resource.ResourceSet

class EntityUtils {

	def static String getQualifiedDtoNameForEntity(JvmType type) {
		try {
			var qualifiedEntityName = type.qualifiedName
			var resourceSet = type.eResource.resourceSet
			var searchName = qualifiedEntityName.getQualifiedDtoNameForQualifiedEntityName;
			val objectDescs = ServiceListener.getEObjectDescriptions(OSBPDtoPackage.Literals.LDTO, searchName)
			if (objectDescs.iterator.hasNext) {
				val eobjectDesc = objectDescs.iterator.next
				if (resourceSet !== null) {

					//var dto = resourceSet.getEObject(eobjectDesc.EObjectURI, true) as LDto
					return eobjectDesc.name.toString
				}
			}
		} catch (Exception e) {
			e.printStackTrace
		}
		return null
	}

	def static LDto getDtoForEntity(JvmType type) {
		return getDtoForEntity(type.qualifiedName, type.eResource.resourceSet)
	}
	
	def static LDto getDtoForEntity(String qualifiedEntityName, ResourceSet resourceSet) {
		try {
			var searchName = qualifiedEntityName.getQualifiedDtoNameForQualifiedEntityName;
			val objectDescs = ServiceListener.getEObjectDescriptions(OSBPDtoPackage.Literals.LDTO, searchName)
			if (objectDescs.iterator.hasNext) {
				val eobjectDesc = objectDescs.iterator.next
				if (resourceSet !== null) {
					return resourceSet.getEObject(eobjectDesc.EObjectURI, true) as LDto
				}
			}
		} catch (Exception e) {
			e.printStackTrace
		}
		return null
	}

	/**
     * get the full qualified dto name for a LEnum
     * <br>
     * <b>The DTO for an LEnum <u>never</u> ends with the postfix <code>Dto</code>!</b> 
     */
	def static String getDtoFQNForLEnum(LEnum lenum) {
		var container = lenum as EObject
		while	((container !== null) && !(container instanceof LTypedPackage)) {
			container = container.eContainer
		}
		return applyDtoPackageNameFromEntityPackageNameForEnum(
			'''«(container as LTypedPackage).name».«lenum.name»''')
	}

	/**
     * get the full qualified dto name for a LBean
     * <br>
     * <b>The DTO for an LBean <u>always</u> ends with the postfix <code>Dto</code>!</b> 
     */
	def static String getDtoFQNForLBean(LBean bean) {
		return getQualifiedDtoNameForQualifiedEntityName(bean.FQNForLBean)
	}

	/**
     * get the full qualified dto name for a LEntity
     * <br>
     * <b>The DTO for an LEntity <u>always</u> ends with the postfix <code>Dto</code>!</b> 
     */
	def static String getDtoFQNForLEntity(LEntity entity) {
		return getQualifiedDtoNameForQualifiedEntityName(entity.FQNForLEntity)
	}

	/**
     * get the full qualified name for a LEntity
     */
	def static String getFQNForLEntity(LEntity entity) {
		return '''«(entity.eContainer as LTypedPackage).name».«entity.name»'''
	}

	/**
     * get the full qualified name for a LBean
     */
	def static String getFQNForLBean(LBean bean) {
		return '''«(bean.eContainer as LTypedPackage).name».«bean.name»'''
	}

	/**
     * get the full qualified dto name for a full qualified entity name!
     * <br>
     * <b>The DTO for an LEntity <u>always</u> ends with the postfix <code>Dto</code>!</b> 
     */
	public def static String getQualifiedDtoNameForQualifiedEntityName(String qualifiedEntityName) {
		return NamingConventionsUtil.toDtoQualifiedName(qualifiedEntityName);
	}

	/**
     * get the full qualified dto name for a full qualified entity name!
     * <br>
     * <b>The DTO for an LEntity <u>always</u> ends with the postfix <code>Dto</code>!</b> 
     */
	public def static String getQualifiedEntityNameForQualifiedDtoName(String qualifiedDtoName) {
		return NamingConventionsUtil.toFqnEntityName(qualifiedDtoName);
	}

	private final static String DTOS_PACKAGE_TOKEN = ".dtos."

	/**
	 * <b><u>Dirty Hack</u></b>: Apply the package name modification from LEnum to LDto
     * <br>
     * <b>The LEnum <u>may or may not</u> reside in a package <code>*.entities.*</code>!</b> 
     * <br>
     * <b>The LDto <u>always</u> resides in a package <code>*.dtos.*</code>!</b> 
	 */
	protected def static String applyDtoPackageNameFromEntityPackageNameForEnum(String fullQualifiedEnumName) {

		// simply replace .entities. with .dtos.
		var fullQualifiedDtoName = NamingConventionsUtil.toDtoQualifiedNameForEnum(fullQualifiedEnumName)

		// BUT if there is no .dtos.
		if (!fullQualifiedDtoName.contains(DTOS_PACKAGE_TOKEN)) {

			// just add .dtos. as last subpackage
			var lastDot = fullQualifiedDtoName.lastIndexOf(".")
			fullQualifiedDtoName = fullQualifiedDtoName.substring(0, lastDot) + DTOS_PACKAGE_TOKEN +
				fullQualifiedDtoName.substring(lastDot + 1)
		}
		return fullQualifiedDtoName
	}

	def static LEntity getEntityFromDto(JvmType type) {
		var LEntity entity = null
		try {
			var qualifiedDtoName = type?.qualifiedName
			var resourceSet = type?.eResource?.resourceSet
			val objectDescs = ServiceListener.getEObjectDescriptions(OSBPDtoPackage.Literals.LDTO, qualifiedDtoName)
			if (objectDescs?.iterator.hasNext) {
				val eobjectDesc = objectDescs.iterator.next
				if (resourceSet !== null) {
					var dto = resourceSet.getEObject(eobjectDesc.EObjectURI, true) as LDto
					if (dto !== null && dto.wrappedType !== null) {
						if (dto.wrappedType.eIsProxy) {
							val entityDescs = ServiceListener.getEObjectDescriptions(OSBPEntityPackage.Literals.LENTITY,
								qualifiedDtoName.replace(".dtos.", ".entities.").replace("Dto", ""))
							if (entityDescs.iterator.hasNext) {
								val entityObjectDesc = entityDescs.iterator.next
								if (resourceSet !== null) {
									entity = resourceSet.getEObject(entityObjectDesc.EObjectURI, true) as LEntity
								}
							}
						} else {
							entity = dto.wrappedType as LEntity
						}

					}
				}
			}
		} catch (Exception e) {
			// NOP
		}
		return entity
	}

	def static LEntity getEntityFromDto(LDto dto) {
		var LEntity entity = null
		if (dto !== null && dto.wrappedType !== null) {
			if (dto.wrappedType.eIsProxy) {
				throw new IllegalStateException
			} else {
				entity = dto.wrappedType as LEntity
			}

		}
		return entity
	}

	def static LDto getDto(JvmType type) {
		try {
			var qualifiedDtoName = type.qualifiedName
			var resourceSet = type.eResource.resourceSet
			val objectDescs = ServiceListener.getEObjectDescriptions(OSBPDtoPackage.Literals.LDTO, qualifiedDtoName)
			if (objectDescs.iterator.hasNext) {
				val eobjectDesc = objectDescs.iterator.next
				if (resourceSet !== null) {
					return resourceSet.getEObject(eobjectDesc.EObjectURI, true) as LDto
				}
			}
		} catch (Exception e) {
			// NOP
		}
		return null
	}

}
