/*****************************************************************************
 * Copyright (c) 2018 CEA LIST and others.
 * 
 * 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
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   CEA LIST - Initial API and implementation
 *   
 *****************************************************************************/

package org.eclipse.papyrus.cdo.benchmarks.tests;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.emf.gmf.command.GMFtoEMFCommandWrapper;
import org.eclipse.papyrus.infra.services.edit.service.ElementEditServiceUtils;
import org.eclipse.papyrus.infra.services.edit.service.IElementEditService;
import org.eclipse.papyrus.uml.service.types.element.UMLElementTypes;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.UMLFactory;

/**
 * @author VL222926
 *
 */
public class ModelConstructor<T extends IPapyrusModelCreation> {

	private T creationHelper;

	protected ExecutionTimeHelper timeHelper;

	public ModelConstructor(final T creationHelper, final ExecutionTimeHelper timeHelper) {
		this.creationHelper = creationHelper;
		this.timeHelper = timeHelper;
	}


	/**
	 * r
	 * 
	 * @param folderName
	 * @param nbElementsToCreate
	 * @param elementType
	 * @param profilesName
	 * @throws Exception
	 */
	public void createElementsInModel(final String folderName, int nbElementsToCreate, IHintedType elementType, List<String> profilesName) throws Exception {

		String modelName = Long.toString(System.currentTimeMillis());

		// creating model set
		timeHelper.startCounting(ExecutionTimeHelper.STEP_1);
		this.creationHelper.initPapyrusEnvironnement(folderName, modelName, profilesName);
		timeHelper.stop();

		Assert.isNotNull(creationHelper.getServicesRegistry());
		Assert.isNotNull(creationHelper.getModelSet());

		// creating classes
		final Model model = this.creationHelper.getModelRoot();
		final ModelSet modelSet = this.creationHelper.getModelSet();


		final IElementEditService provider = ElementEditServiceUtils.getCommandProvider(model);
		int modulo = 100;
		timeHelper.startCounting(ExecutionTimeHelper.STEP_2);
		for (int i = 0; i < nbElementsToCreate; i++) {
			CreateElementRequest request = new CreateElementRequest(modelSet.getTransactionalEditingDomain(), model, elementType);
			final ICommand cmd = provider.getEditCommand(request);
			modelSet.getTransactionalEditingDomain().getCommandStack().execute(GMFtoEMFCommandWrapper.wrap(cmd));
			if (i % modulo == 0) {
				timeHelper.top();
			}
		}

		timeHelper.stop();

		// saving the models
		timeHelper.startCounting(ExecutionTimeHelper.STEP_3);
		try {
			modelSet.save(new NullProgressMonitor());
			// modelSet.
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		timeHelper.stop();


		// accessing to an element
		List<String> names = Arrays.asList(elementType.getId().split("\\."));
		Collections.reverse(names);
		String name = names.get(0);
		int i = 0;
		timeHelper.startCounting(ExecutionTimeHelper.STEP_4);
		while (i + modulo <= nbElementsToCreate) {
			i = i + modulo;
			final NamedElement element = model.getMember(name + i);
			// TODO !
			Assert.isNotNull(element);
			if (profilesName.size() > 0) {
				Assert.isTrue(element.getAppliedStereotypes().size() > 0);
			}
			timeHelper.top();
		}

		timeHelper.stop();

		name = name + "5000";
		NamedElement element = null;
		if (nbElementsToCreate > 5000) {
			timeHelper.startCounting(ExecutionTimeHelper.STEP_5);
			for (int j = 0; j < 100; j++) {// we do it 100 times
				element = model.getMember(name);
			}
			timeHelper.stop();
		}

		if (nbElementsToCreate > 5000) {

			if (profilesName.size() > 0) {
				timeHelper.startCounting(ExecutionTimeHelper.STEP_6);
				for (int j = 0; j < 100; j++) {// we do it 100 times
					element.getAppliedStereotypes();
				}
				timeHelper.stop();
			}
		}

		final Resource res = element.eResource();
		Assert.isNotNull(res);
		timeHelper.startCounting(ExecutionTimeHelper.STEP_7);
		for (int k = 0; k < 100; k++) {
			final EObject newModel = UMLFactory.eINSTANCE.createModel();
			RecordingCommand rc = new RecordingCommand(modelSet.getTransactionalEditingDomain()) {

				@Override
				protected void doExecute() {
					res.getContents().add(newModel);

				}
			};
			modelSet.getTransactionalEditingDomain().getCommandStack().execute(rc);
		}
		timeHelper.stop();
		try {
			modelSet.save(new NullProgressMonitor());
			// modelSet.
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


		this.creationHelper.disposeAll();
	}


}
