package eu.dnetlib.r2d2.neo4j;

import java.util.Arrays;

import javax.annotation.Resource;

import org.apache.log4j.BasicConfigurator;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.EmbeddedGraphDatabase;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import eu.dnetlib.r2d2.neo4j.dao.ProfileDao;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jProfile;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/eu/dnetlib/r2d2/neo4j/applicationContext-neo4j.xml", "/eu/dnetlib/r2d2/neo4j/applicationContext-r2d2-neo4j-test.xml"})
public class SimpleBenchmark {
	
	@Resource
	private ProfileDao profileDao = null;

	@Resource
	private EmbeddedGraphDatabase graphDb = null;
	
	int testCount = 1001;
	
	@BeforeClass
	public static void setup() {
		BasicConfigurator.configure();
	}
	
	@Test
	public void test() throws InterruptedException {
		long[] times = new long[testCount + 1];
		
		for (int i = 0; i < testCount; i++) {
			times[i] = System.currentTimeMillis();
			
			Transaction tx = graphDb.beginTx();
			Neo4jProfile p = profileDao.newBean();
			
			p.setName(System.currentTimeMillis() + "");
			
			tx.success();
			tx.finish();
		}
		
		times[testCount] = System.currentTimeMillis();
		
		System.out.println("Number of transactions: " + testCount);
		System.out.println("total time " + (times[times.length - 1] - times[0]));

		for (int i = 0; i < testCount; i++ )
			times[i] = times[i+1] - times[i];
		
		System.out.println("median: " + median(times));
 		System.out.println("average: " + average(Arrays.copyOfRange(times, 0, times.length - 2)));
 		
 		
 		Thread.sleep(30000);
	}
	
	/**
	 * I know the implementation is wrong, but it's a small error. It would
	 * take less time to fix it than write this, but choose an odd number of 
	 * tests instead :)
	 * @param values
	 * @return
	 */
	long median(long[] values) {
		Arrays.sort(values);

		
		return values[(int) Math.floor(values.length / 2)];
	}
	
	long average(long[] values) {
		long avg = 0;
		
		for (int i = 0; i < values.length; i++)
			avg += values[i];
		
		return avg/values.length;
	}
}
