/*******************************************************************************
 * Copyright (c) 2015, 2018 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
package org.eclipse.qvtd.xtext.qvtimperative.tests;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import simpleuml2rdbms.rdbms.RDBMSPackage;

import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.xtext.tests.XtextTestCase.Normalizer;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.qvtd.xtext.qvtbase.tests.ModelNormalizer;

public class SimpleRDBMSNormalizer implements ModelNormalizer
{
	public static final @NonNull SimpleRDBMSNormalizer INSTANCE = new SimpleRDBMSNormalizer();

	protected static class RModelElementNameComparator implements Comparator<EObject>
	{
		private final @NonNull EAttribute rmodelElementName;

		public RModelElementNameComparator(@NonNull EAttribute rmodelElementName) {
			this.rmodelElementName = rmodelElementName;
		}

		@Override
		public int compare(EObject o1, EObject o2) {
			String n1 = (String) o1.eGet(rmodelElementName);
			String n2 = (String) o2.eGet(rmodelElementName);
			return ClassUtil.safeCompareTo(n1, n2);
		}
	}

	protected class SchemaNormalizer implements Normalizer
	{
		protected final @NonNull EObject schema;
		protected final @NonNull EReference schemaTables;
		protected final @NonNull RModelElementNameComparator rmodelElementNameComparator;

		public SchemaNormalizer(@NonNull EObject schema, @NonNull EReference schemaTables, @NonNull RModelElementNameComparator rmodelElementNameComparator) {
			this.schema = schema;
			this.schemaTables = schemaTables;
			this.rmodelElementNameComparator = rmodelElementNameComparator;
		}

		@Override
		public void denormalize() {
			throw new UnsupportedOperationException();
		}

		@Override
		public void normalize() {
			@SuppressWarnings("unchecked")
			EList<EObject> tables = (EList<EObject>) schema.eGet(schemaTables);
			ECollections.sort(tables, rmodelElementNameComparator);
		}
	}

	protected class TableNormalizer implements Normalizer
	{
		protected final @NonNull EObject table;
		protected final @NonNull EReference tableColumn;
		protected final @NonNull RModelElementNameComparator rmodelElementNameComparator;

		public TableNormalizer(@NonNull EObject table, @NonNull EReference tableColumn, @NonNull RModelElementNameComparator rmodelElementNameComparator) {
			this.table = table;
			this.tableColumn = tableColumn;
			this.rmodelElementNameComparator = rmodelElementNameComparator;
		}

		@Override
		public void denormalize() {
			throw new UnsupportedOperationException();
		}

		@Override
		public void normalize() {
			@SuppressWarnings("unchecked")
			EList<EObject> columns = (EList<EObject>) table.eGet(tableColumn);
			ECollections.sort(columns, rmodelElementNameComparator);
		}
	}

	@Override
	public @NonNull List<@NonNull Normalizer> normalize(@NonNull Resource resource) {
		EObject eRoot = resource.getContents().get(0);
		EPackage ePackage = eRoot.eClass().getEPackage();
		EClass schemaClass = (EClass) ePackage.getEClassifier(RDBMSPackage.Literals.SCHEMA.getName());
		assert schemaClass != null;
		EClass tableClass = (EClass) ePackage.getEClassifier(RDBMSPackage.Literals.TABLE.getName());
		assert tableClass != null;
		EClass rModelElementClass = (EClass) ePackage.getEClassifier(RDBMSPackage.Literals.RMODEL_ELEMENT.getName());
		assert rModelElementClass != null;
		EReference schemaTables = (EReference) schemaClass.getEStructuralFeature(RDBMSPackage.Literals.SCHEMA__TABLES.getName());
		assert schemaTables != null;
		EReference tableColumn = (EReference) tableClass.getEStructuralFeature(RDBMSPackage.Literals.TABLE__COLUMNS.getName());
		assert tableColumn != null;
		EAttribute rmodelElementName = (EAttribute) tableClass.getEStructuralFeature(RDBMSPackage.Literals.RMODEL_ELEMENT__NAME.getName());
		assert rmodelElementName != null;
		RModelElementNameComparator rmodelElementNameComparator = new RModelElementNameComparator(rmodelElementName);
		List<@NonNull Normalizer> normalizers = new ArrayList<>();
		for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) {
			EObject eObject = tit.next();
			EClass eClass = eObject.eClass();
			if (schemaClass.isSuperTypeOf(eClass)) {
				normalizers.add(new SchemaNormalizer(eObject, schemaTables, rmodelElementNameComparator));
			} else {
				if (tableClass.isSuperTypeOf(eClass)) {
					normalizers.add(new TableNormalizer(eObject, tableColumn, rmodelElementNameComparator));
				}
			}
		}
		for (Normalizer normalizer : normalizers) {
			normalizer.normalize();
		}
		return normalizers;
	}
}