/*******************************************************************************
 * Copyright (c) 2009, 2014 Xored Software Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.tesla.core;

import java.util.List;

import org.eclipse.rcptt.tesla.core.info.InfoFactory;
import org.eclipse.rcptt.tesla.core.info.Q7WaitInfo;
import org.eclipse.rcptt.tesla.core.info.Q7WaitInfoRoot;

public class Q7WaitUtils {

	public static void startInfo(String kind, String className, Q7WaitInfoRoot root) {
		if (root == null || className == null) {
			return;
		}
		synchronized (root) {
			updateClassName(className, root);
			long currentTime = System.currentTimeMillis();

			Q7WaitInfo info = findInfo(kind, className, root);
			if (info != null) {
				if (infoNodeIsOpen(info)) {
					return;
				}
				root.setTick(root.getTick() + 1);
				info.setLastTick(root.getTick());
				info.setLastStartTime(currentTime);
				info.setTicks(info.getTicks() + 1);
				return;
			}
			info = createInfo(kind, className, root);
			info.setStartTime(currentTime);
			info.setLastStartTime(currentTime);
		}
	}

	public static void finishInfo(String kind, String className, Q7WaitInfoRoot root) {
		if (root == null || className == null) {
			return;
		}
		synchronized (root) {
			updateClassName(className, root);
			long currentTime = System.currentTimeMillis();

			Q7WaitInfo info = findInfo(kind, className, root);
			if (info != null) {
				info.setEndTime(currentTime);
				long duration = info.getEndTime() - info.getLastStartTime();
				info.setDuration(info.getDuration() + duration);
				return;
			}
			info = createInfo(kind, className, root);
			info.setStartTime(root.getStartTime());
			info.setLastStartTime(currentTime);
			info.setEndTime(currentTime);
		}
	}

	public static void updateInfo(String kind, String className, Q7WaitInfoRoot root) {
		if (root == null || className == null) {
			return;
		}
		synchronized (root) {
			updateClassName(className, root);
			long currentTick = root.getTick();
			long currentTime = System.currentTimeMillis();

			Q7WaitInfo info = findInfo(kind, className, root);
			if (info != null) {
				long lastTick = info.getLastTick();
				if (lastTick == currentTick) {
					// This is previous execution counter here
					info.setEndTime(currentTime);
					long duration = info.getEndTime() - info.getLastStartTime();
					info.setDuration(info.getDuration() + duration);
				}
				root.setTick(root.getTick() + 1);
				info.setLastTick(root.getTick());
				info.setLastStartTime(currentTime);
				return;
			}

			info = createInfo(kind, className, root);
			info.setStartTime(currentTime);
			info.setLastStartTime(currentTime);
			info.setEndTime(currentTime);
		}
	}

	private static Q7WaitInfo findInfo(String kind, String className, Q7WaitInfoRoot root) {
		int typeId = getID(kind, root.getTypesNames());
		int classId = getID(className, root.getClassNames());
		if (classId == -1 || typeId == -1) {
			return null;
		}

		for (Q7WaitInfo info : root.getInfos()) {
			if (info.getTypeId() == typeId && info.getClassId() == classId) {
				return info;
			}
		}
		return null;
	}

	private static Q7WaitInfo createInfo(String kind, String className, Q7WaitInfoRoot root) {
		int typeId = getID(kind, root.getTypesNames());
		int classId = getID(className, root.getClassNames());

		if (typeId == -1) {
			typeId = root.getTypesNames().size();
			root.getTypesNames().add(kind);
		}
		if (classId == -1) {
			classId = root.getClassNames().size();
			root.getClassNames().add(className);
		}

		Q7WaitInfo info = InfoFactory.eINSTANCE.createQ7WaitInfo();
		root.getInfos().add(info);
		root.setTick(root.getTick() + 1);

		info.setTypeId(typeId);
		info.setClassId(classId);
		info.setTicks(1);
		info.setLastTick(root.getTick());
		return info;
	}

	private static boolean infoNodeIsOpen(Q7WaitInfo info) {
		return info.getLastStartTime() > info.getEndTime();
	}

	private static int getID(String kind, List<String> values) {
		for (int i = 0; i < values.size(); i++) {
			String typeName = values.get(i);
			if (typeName.equals(kind)) {
				return i;
			}
		}
		return -1;
	}

	private static void updateClassName(String className, Q7WaitInfoRoot info) {
		// Update class name if contains $ to contain method name instead
		int pos = className.indexOf("$");
		if (pos != -1) {
			String methodValue = info.getInnerClassMap().get(className);
			if (methodValue == null) {
				StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
				String clName = className.substring(0, pos);
				for (int i1 = 0; i1 < stackTrace.length; i1++) {
					if (stackTrace[i1].getClassName().startsWith(clName)) {
						methodValue = stackTrace[i1].getMethodName() + ":"
								+ stackTrace[i1].getLineNumber();
						break;
					}
					if (stackTrace[i1].getClassName().equals("org.eclipse.rcptt.tesla.internal.ui.player.SWTUIPlayer")
							&& stackTrace[i1].getMethodName().equals("exec")) {
						methodValue = stackTrace[i1 + 1].getMethodName() + ":"
								+ stackTrace[i1 + 1].getLineNumber();
						break;
					}
				}
				if (methodValue != null) {
					info.getInnerClassMap().put(className, /* className.substring(0, pos) + "." + */methodValue);
				}
			}
		}
	}

}
