/*******************************************************************************
 * Copyright (c) 2011-2016 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
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License, v. 2.0 are satisfied: GNU General Public License, version 3.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-3.0
 *
 * Contributors:
 *     Antonio Garcia-Dominguez - initial API and implementation
 ******************************************************************************/
package org.eclipse.hawk.graph.sampleListener;

import java.util.Arrays;

import org.eclipse.hawk.core.IModelIndexer;
import org.eclipse.hawk.core.VcsCommitItem;
import org.eclipse.hawk.core.graph.IGraphChangeListener;
import org.eclipse.hawk.core.graph.IGraphNode;
import org.eclipse.hawk.core.model.IHawkClass;
import org.eclipse.hawk.core.model.IHawkObject;
import org.eclipse.hawk.core.model.IHawkPackage;

public class ExampleListener implements IGraphChangeListener {

	@Override
	public void synchroniseStart() {
		// System.out.println("synchronize started");
	}

	@Override
	public void synchroniseEnd() {
		// System.out.println("synchronize ended");
	}

	@Override
	public void changeStart() {
		// System.out.println("change started");
	}

	@Override
	public void changeSuccess() {
		// System.out.println("change succeeded");
	}

	@Override
	public void changeFailure() {
		// System.out.println("change failed");
	}

	@Override
	public void metamodelAddition(IHawkPackage pkg, IGraphNode pkgNode) {
		// System.out.println(String.format("metamodel %s added as node %s",
		// pkg.getNsURI(), pkgNode.getId()));
	}

	@Override
	public void classAddition(IHawkClass cls, IGraphNode clsNode) {
		// System.out.println(String.format("class %s added as node %s",
		// cls.getName(), clsNode.getId()));
	}

	@Override
	public void fileAddition(VcsCommitItem s, IGraphNode fileNode) {
		// System.out.println(String.format("rev %s: file %s added as node %s",
		// s.getCommit().getRevision(), s.getPath(), fileNode.getId()));
	}

	@Override
	public void fileRemoval(VcsCommitItem s, IGraphNode fileNode) {
		// System.out.println(String.format("rev %s: file %s removed as node %s",
		// s.getCommit().getRevision(), s.getPath(), fileNode.getId()));
	}

	@Override
	public void modelElementAddition(VcsCommitItem s, IHawkObject element,
			IGraphNode elementNode, boolean isTransient) {
		// System.out.println(String.format("rev %s: instance of %s in %s added as node %s",
		// s.getCommit().getRevision(), element.getType().getName(),
		// s.getPath(), elementNode.getId()));
	}

	@Override
	public void modelElementRemoval(VcsCommitItem s, IGraphNode elementNode,
			boolean isTransient) {
		// System.out.println(String.format("rev %s: model element in node %s removed",
		// s.getCommit().getRevision(), elementNode.getId()));
	}

	@Override
	public void modelElementAttributeUpdate(VcsCommitItem s,
			IHawkObject eObject, String attrName, Object oldValue,
			Object newValue, IGraphNode elementNode, boolean isTransient) {

		//String oldv = convertToString(oldValue);
		//String newv = convertToString(newValue);

		// if (oldv.equals("1098.0") || oldv.equals("1097.0") ||
		// newv.equals("1098.0") || newv.equals("1097.0"))

		// System.out.println(String.format("rev %s: attribute %s in node %s changed from '%s' to '%s'",
		// s
		// .getCommit().getRevision(), attrName, elementNode.getId(), oldv,
		// newv)
		// + " [id:"+
		// elementNode.getProperty(IModelIndexer.IDENTIFIER_PROPERTY)+ "]");
	}

	protected String convertToString(Object value) {

		String ret = value + "";

		if (value != null) {

			Class<?> c = value.getClass().getComponentType();

			if (c != null) {
				if (value instanceof Object[])
					ret = Arrays.toString((Object[]) value);
				else if (value instanceof byte[])
					ret = Arrays.toString((byte[]) value);
				else
					System.err
							.println("convertToString failed, value is of type: "
									+ value.getClass());
			}
		}

		return ret;

	}

	@Override
	public void modelElementAttributeRemoval(VcsCommitItem s,
			IHawkObject eObject, String attrName, IGraphNode node,
			boolean isTransient) {
		// System.out.println(String.format("rev %s: attribute %s in node %s unset",
		// s.getCommit().getRevision(), attrName, node.getId()));
	}

	@Override
	public void referenceAddition(VcsCommitItem s, IGraphNode source,
			IGraphNode destination, String edgelabel, boolean isTransient) {
		// System.out.println(String.format("rev %s: reference '%s' from node %s to %s added",
		// s.getCommit().getRevision(), edgelabel, source.getId(),
		// destination.getId()));
	}

	@Override
	public void referenceRemoval(VcsCommitItem s, IGraphNode source,
			IGraphNode destination, String edgelabel, boolean isTransient) {
		// System.out.println(String.format("rev %s: reference '%s' from node %s to %s removed",
		// s.getCommit().getRevision(), edgelabel, source.getId(),
		// destination.getId()));
	}

	@Override
	public String getName() {
		return "ExampleListener";
	}

	@Override
	public void setModelIndexer(IModelIndexer m) {
		// not used

	}

}
