/**
 *                                                                            
 * 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 
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 * 
 */

package org.eclipse.osbp.utils.entityhelper

import com.google.inject.Inject
import java.util.Date
import org.eclipse.emf.ecore.resource.ResourceSet
import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions
import org.eclipse.osbp.dsl.semantic.common.types.LDataType
import org.eclipse.osbp.dsl.semantic.common.types.LEnum
import org.eclipse.osbp.dsl.semantic.common.types.LPackage
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
import org.eclipse.osbp.ecview.dsl.extensions.TypeHelper
import org.eclipse.osbp.ui.api.datamart.IDataMart.EType
import org.eclipse.xtext.common.types.JvmEnumerationType
import org.eclipse.xtext.common.types.JvmType
import org.eclipse.xtext.common.types.access.IJvmTypeProvider
import org.eclipse.osbp.dsl.semantic.common.types.LAttribute
import org.eclipse.xtext.common.types.JvmTypeReference
import org.eclipse.osbp.dsl.semantic.common.types.LDateType
import org.eclipse.osbp.runtime.common.layouting.IPropertyConstants

public class DataType {

	@Inject
	@Extension
	TypeHelper typeHelper

	@Inject ModelExtensions entityExtensions

	@Inject
	IJvmTypeProvider.Factory typeProviderFactory

	def public LDataType getLDataType(LAttribute attributeRef) {
		var type = attributeRef.type
		var lDataType = null as LDataType
		if (type instanceof LDataType) {
			lDataType = type as LDataType
		}
		return lDataType
	}

	def public JvmType getJvmType(LAttribute attributeRef) {
		var type = attributeRef.type
		var lDataType = null as LDataType
		var ltype = null as JvmType
		if (type instanceof LDataType) {
			lDataType = type as LDataType
			if (lDataType.isDate) {
				val typeProvider = getTypeProvider(attributeRef.eResource.resourceSet)
				return typeProvider.findTypeByName(Date.name)
			} else if (lDataType.isAsBlob) {
				val typeProvider = getTypeProvider(attributeRef.eResource.resourceSet)
				return typeProvider.findTypeByName("byte[]")
			} else {
				var jvmTypeReference = lDataType.jvmTypeReference
				ltype = jvmTypeReference.type
				if (ltype !== null) {
					return ltype;
				}
			}
		} else if (type instanceof LEnum) {
			var LPackage pkg = type.eContainer as LPackage
			val typeProvider = getTypeProvider(attributeRef.eResource.resourceSet)
			return typeProvider.findTypeByName(pkg.name + "." + type.name)
		}
		var JvmTypeReference typeJvm = null
		if (attributeRef instanceof LEntityAttribute) {
			typeJvm = entityExtensions.toTypeReference(attributeRef)
		} else {
			typeJvm = entityExtensions.toTypeReference(attributeRef)
		}
		
		var typeJvmType = typeJvm.type
		return typeJvmType
	}

	def getTypeProvider(ResourceSet rs) {
		typeProviderFactory.findOrCreateTypeProvider(rs)
	}

	def public EType getBasicType(String typeIdentifier) {
		if (typeIdentifier !== null) {
			var identifier = typeIdentifier
			if (typeIdentifier.startsWith("java.lang.")) {
				identifier = typeIdentifier.substring("java.lang.".length).toLowerCase
			}
			switch (identifier) {
				/**
				 * Date, String, int, boolean, Time 
				 */
				case "boolean": return EType.BOOLEAN
				case "byte": return EType.BYTE
				case "short": return EType.SHORT
				case "int": return EType.INTEGER
				case "integer": return EType.INTEGER
				case "long": return EType.LONG
				case "double": return EType.DOUBLE
				case "float": return EType.FLOAT
				case "BigDecimal": return EType.DOUBLE
				case "java.math.BigDecimal": return EType.DOUBLE
				case "string": return EType.STRING
				case "java.util.Date": return EType.DATE
			}
		}
		return EType.NONE
	}

	def public EType getBasicType(JvmType type) {
		if (type.boolean) {
			return EType.BOOLEAN
		} else if (type.numberWithDigits) {
			val retcode = getBasicType(type.identifier)
			if (retcode !== EType.NONE) {
				return retcode
			}
			return EType.DOUBLE
		} else if (type.numberWithoutDigits) {
			val retcode = getBasicType(type.identifier)
			if (retcode !== EType.NONE) {
				return retcode
			}
			return EType.INTEGER
		} else if (type.string) {
			return EType.STRING
		} else if (type.date) {
			return EType.DATE
		} else if (type instanceof JvmEnumerationType) {
			return EType.LENUM;
		}
		return getBasicType(type.identifier)
	}

	def public EType getBasicType(LAttribute attribute) {
		var lDataType = getLDataType(attribute)
		if (lDataType !== null) {
			if (lDataType.date) {
				if (lDataType.dateType.equals(LDateType.TIMESTAMP)){
					return EType.TIMESTAMP
				} else if (lDataType.dateType.equals(LDateType.DATE)){
					return EType.DATE
				} else {
					return EType.DATE
				}
			}
			if (!lDataType.properties.isNullOrEmpty) {
				// data type is defined as Blob
				if (getJvmType(attribute).string && lDataType.properties.exists[it.key.equalsIgnoreCase(IPropertyConstants.PROPERTY_BLOB)]){
					return EType.BLOPMAPPING
				}
				// data type is defined as rich text area
				if ((getJvmType(attribute).string || lDataType.asBlob) && lDataType.properties.exists[it.value.equalsIgnoreCase(IPropertyConstants.PROPERTY_RICH_TEXT)]){
					return EType.RICHTEXTAREA
				}
				// data type is defined as checkbox
				if (getJvmType(attribute).boolean && lDataType.properties.exists[it.value.equalsIgnoreCase(IPropertyConstants.PROPERTY_CHECKBOX)]){
					return EType.BOOLEAN_CHECKBOX
				}
			}
			if (!attribute.properties.isNullOrEmpty) {
				// Otherwise entity attribute is defined as Blob
				if (getJvmType(attribute).string && attribute.properties.exists[it.key.equalsIgnoreCase(IPropertyConstants.PROPERTY_BLOB)]){
					return EType.BLOPMAPPING
				}
				// Otherwise entity attribute is defined as rich text area
				if ((getJvmType(attribute).string || lDataType.asBlob) && attribute.properties.exists[it.value.equalsIgnoreCase(IPropertyConstants.PROPERTY_RICH_TEXT)]){
					return EType.RICHTEXTAREA
				}
				// data type is defined as rich text area
				if (getJvmType(attribute).boolean && lDataType.properties.exists[it.value.equalsIgnoreCase(IPropertyConstants.PROPERTY_CHECKBOX)]){
					return EType.BOOLEAN_CHECKBOX
				}
			}
			if ("blobMapping".equalsIgnoreCase(lDataType.name)) {
				return EType.BLOPMAPPING
			}
			
		}
		return getBasicType(getJvmType(attribute))
	}
	
	def public EType getBasicType(Class<?> typeClass) {
		return getBasicType(typeClass.canonicalName)
	}

	def public boolean canBeCastFrom(LEntityAttribute targetAttribute, Class<?> sourceClass) {
		return canBeCastFrom(targetAttribute, getBasicType(sourceClass))
	}

	def public boolean canBeCastFrom(LEntityAttribute targetAttribute, EType sourceType) {
		var targetType = getBasicType(targetAttribute)

		switch (targetType) {
			case BOOLEAN: return (sourceType == EType.BOOLEAN)
			case BYTE: return (sourceType == EType.BYTE)
			case DATE: return (sourceType == EType.DATE)
			case TIMESTAMP: return (sourceType == EType.TIMESTAMP)
			case FLOAT: return (sourceType == EType.FLOAT || sourceType == EType.LONG || sourceType == EType.INTEGER ||
				sourceType == EType.SHORT || sourceType == EType.BOOLEAN)
			case DOUBLE: return (sourceType == EType.FLOAT || sourceType == EType.DOUBLE || sourceType == EType.LONG ||
				sourceType == EType.INTEGER || sourceType == EType.SHORT || sourceType == EType.BOOLEAN)
			case SHORT: return (sourceType == EType.SHORT || sourceType == EType.BOOLEAN)
			case INTEGER: return (sourceType == EType.INTEGER || sourceType == EType.SHORT ||
				sourceType == EType.BOOLEAN)
			case LONG: return (sourceType == EType.LONG || sourceType == EType.INTEGER || sourceType == EType.SHORT ||
				sourceType == EType.BOOLEAN)
			case STRING: return true
			case TIME: return (sourceType == EType.TIME)
			case LENUM: return (sourceType == EType.INTEGER || sourceType == EType.BOOLEAN)
			case NONE: return false
		}
		return false
	}
}
