/**
 *                                                                            
 *  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.xtext.chart.scoping

import java.util.ArrayList
import java.util.LinkedHashSet
import java.util.List
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.osbp.xtext.chart.ChartDSLPackage
import org.eclipse.osbp.xtext.chart.ChartDatamart
import org.eclipse.osbp.xtext.datamartdsl.AxisEnum
import org.eclipse.osbp.xtext.datamartdsl.DatamartAxis
import org.eclipse.osbp.xtext.datamartdsl.DatamartCube
import org.eclipse.osbp.xtext.datamartdsl.DatamartCubeAxis
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition
import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity
import org.eclipse.osbp.xtext.datamartdsl.DatamartMember
import org.eclipse.osbp.xtext.datamartdsl.DatamartOwner
import org.eclipse.osbp.xtext.datamartdsl.DatamartTask
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.resource.EObjectDescription
import org.eclipse.xtext.resource.IEObjectDescription
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.impl.MapBasedScope
import org.eclipse.xtext.scoping.impl.FilteringScope
import org.eclipse.osbp.xtext.oxtype.resource.EcoreUtil3

class ChartDSLScopeProvider extends AbstractChartDSLScopeProvider {
	@Override
	override IScope getScope(EObject context, EReference reference) {
		if (reference == ChartDSLPackage.Literals.CHART_AXIS__AXIS) {
			return getScope_Chart_Axis_axis(context)
		} else if (reference == ChartDSLPackage.Literals.CHART_DATAMART__DATAMART_REF) {
			return getScope_Chart_DatamartRef(context as ChartDatamart, reference)
		}
		return super.getScope(context, reference)
	}

	def IScope getScope_Chart_Axis_axis(EObject object) {
		var result = <IEObjectDescription>newArrayList
		var eObj = object
		while (!(eObj instanceof ChartDatamart)) {
			eObj = eObj.eContainer
		}
		if (eObj !== null) {
			var datamart = (eObj as ChartDatamart).datamartRef
			if (datamart !== null && datamart.source !== null) {
				if (datamart.source instanceof DatamartCube) {
					for (axis : (datamart.source as DatamartCube).axisslicer) {
						if (axis instanceof DatamartCubeAxis) {
							var literal = (axis as DatamartCubeAxis).axis.name.literal
							result.add(EObjectDescription.create(literal, (axis as DatamartCubeAxis).axis))
						}
					}
				} else if (datamart.source instanceof DatamartEntity) {
					getEntityAxes(datamart.source as DatamartEntity, result)
				} else if (datamart.source instanceof DatamartTask) {
					result.add(EObjectDescription.create(AxisEnum.COLUMNS.literal, (datamart.source as DatamartTask)))
					result.add(EObjectDescription.create(AxisEnum.ROWS.literal, (datamart.source as DatamartTask)))
				}
			}
		}
		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
	}
	
	def IScope getScope_Chart_DatamartRef(ChartDatamart chartDatamart, EReference reference) {
		var superScope = super.getScope(chartDatamart, reference)
		return new FilteringScope(superScope, [
					if (it.EObjectOrProxy instanceof DatamartDefinition) {
						var datamart = it.EObjectOrProxy as DatamartDefinition
						datamart = EcoreUtil3.resolve(datamart, chartDatamart.eResource.resourceSet) as DatamartDefinition
						return datamart.filterScopeCondition
					}
					return false
				])
		
	}

	def void getEntityAxes(DatamartEntity entity, ArrayList<IEObjectDescription> result) {
		for (datamartAxis : entity.createEntityAxesList) {
			result.add(EObjectDescription.create(datamartAxis.name.literal, datamartAxis))
		}
	}
	
	private def filterScopeCondition (DatamartDefinition datamart) {
		if (datamart !== null && datamart.source !== null) {
			if (datamart.source instanceof DatamartCube) {
				for (axis : (datamart.source as DatamartCube).axisslicer) {
					if (axis instanceof DatamartCubeAxis) {
						return true
					}
				}
			} else if (datamart.source instanceof DatamartEntity) {
				if ((datamart.source as DatamartEntity).createEntityAxesList.size > 0){
					return true
				}
			} else if (datamart.source instanceof DatamartTask) {
				return true
			}
		}
		return false
	}
	
	private def List<DatamartAxis> createEntityAxesList(DatamartEntity entity) {
		var datamartAxisList = newArrayList()
		for (navigation : entity.navigations) {
			if (navigation instanceof DatamartMember) {
				datamartAxisList.addAll((navigation as DatamartMember).datamartEntity.createEntityAxesList)
				for (attribute : (navigation as DatamartMember).datamartEntity.attributes) {
					datamartAxisList.add(attribute.axis)
				}
			}
			if (navigation instanceof DatamartOwner) {
				datamartAxisList.addAll((navigation as DatamartOwner).datamartEntity.createEntityAxesList)
				for (attribute : (navigation as DatamartOwner).datamartEntity.attributes) {
					datamartAxisList.add(attribute.axis)
				}
			}
		}
		for (attribute : entity.attributes) {
			datamartAxisList.add(attribute.axis)
		}
		datamartAxisList
	}

}
