/*******************************************************************************
 * Copyright (c) 2009 The University of York.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * Contributors:
 *     Louis Rose - initial API and implementation
 ******************************************************************************
 *
 * $Id$
 */
package org.eclipse.concordance.test.performance;

import java.util.Random;

import org.eclipse.concordance.test.performance.generator.xrefs.CrossReferencingGraphsGenerator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.epsilon.concordance.clients.test.ConcordanceClientIntegrationTest;
import org.eclipse.epsilon.concordance.history.ConcordanceHistory.EventType;
import org.junit.Before;
import org.junit.Test;

public class CrossReferenceReconcilerPerformanceTests extends ConcordanceClientIntegrationTest {

	private static final int NUMBER_OF_MODELS     = 100;
	private static final int NUMBER_OF_OPERATIONS = 10;
	
	
	@Before @Override
	public void setupNature() throws CoreException, InterruptedException {
		new CrossReferencingGraphsGenerator().generate(project.getLocation().toFile(), "Graph", NUMBER_OF_MODELS);
		
		refreshContents(project);
		System.out.println(project.members().length - 1 + " models were generated.");
		
		addConcordanceNature(project);
		waitFor(eventsForNewFiles(modelsIn(project)));
		
		printTimes("Indexing");
		
		//Profiler.INSTANCE.reset();
	}

	@Test
	public void delete() throws CoreException, InterruptedException {
		for (int index = 1; index <= NUMBER_OF_OPERATIONS; index++) {
			final IFile randomGraph = randomGraph();
			
			System.out.println("Deleting: " + randomGraph.getName());
			deleteResource(randomGraph);
			waitFor(event(EventType.DELETE, randomGraph));
		}
		
		printTimes("Delete");
	}
	
	@Test
	public void move() throws CoreException, InterruptedException {
		for (int index = 1; index <= NUMBER_OF_OPERATIONS; index++) {
			IFile randomGraph    = randomGraph();
			final String newPath = randomGraph.getName().replace("Graph", "Moved");
			
			System.out.println("Moving: " + randomGraph.getName() + " to " + newPath);
			randomGraph = moveFile(randomGraph, newPath);
			waitFor(event(EventType.MOVE, randomGraph));
		}
		
		printTimes("Move");
	}

	@Test
	public void change() throws CoreException, InterruptedException {
		for (int index = 1; index <= NUMBER_OF_OPERATIONS; index++) {
			final IFile randomGraph = randomGraph();
			
			System.out.println("Changing: " + randomGraph.getName());
			new GraphUpdater().update(randomGraph.getLocation().toFile());
			randomGraph.refreshLocal(IResource.DEPTH_ZERO, null);
			
			waitFor(event(EventType.CHANGE, randomGraph));
		}
		
		printTimes("Change");
	}
	
	
	private void printTimes(String type) {
		//System.out.println(type + " was executed " + Profiler.INSTANCE.getExecutionCount(type) + " times.");
		//System.out.println("Aggregated total: " + Profiler.INSTANCE.getTotalTime(type, true));
		//System.out.println("Individual total: " + Profiler.INSTANCE.getTotalTime(type, false));
	}
	
	
	private IFile randomGraph() throws CoreException {
		IResource graph = null;
		final Random rnd = new Random();
		
		do {
			graph = project.findMember("Graph" + (rnd.nextInt(100) + 1) + ".model");
		} while (graph == null || !graph.exists());
		
		return (IFile)graph;
	}
}
