/*******************************************************************************
 * Copyright (c) 2014 Formal Mind GmbH, University of Duesseldorf 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:
 *     Michael Jastram - initial API and implementation
 *******************************************************************************/
package org.eclipse.rmf.reqif10.pror.editor.presentation;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.ListIterator;
import java.util.Set;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.eclipse.emf.common.CommonPlugin;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.rmf.reqif10.Identifiable;

import com.google.common.collect.Lists;

/**
 * @author Graf
 *
 */
public class TimestampedCompoundCommand extends CompoundCommand {

	private EditingDomain domain;

	public TimestampedCompoundCommand(EditingDomain domain, Command command) {
		super(Collections.singletonList(command));
		this.domain = domain;
	}

	@Override
	public void execute() {
		System.out.println("Executing timestamp command");
		Calendar cal = Calendar.getInstance();
		Date lastChange = cal.getTime();
		GregorianCalendar c = new GregorianCalendar();
		c.setTime(lastChange);
		XMLGregorianCalendar date2 = null;
		try {
			date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
		} catch (DatatypeConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Set<Object> lastChangeObjects = new HashSet<Object>();
		ArrayList<Command> arrList = Lists.newArrayList(commandList);
		commandList = arrList;
		for (ListIterator<Command> commands = arrList.listIterator(); commands
				.hasNext();) {
			try {
				Command command = commands.next();
				System.out.println("Executing "+command);
				command.execute();
				
				for(Object obj: command.getAffectedObjects() ) {
					System.out.println("Affected "+obj);
					if(obj instanceof Identifiable && lastChangeObjects.add(obj)) {
						System.out.println("Adding setLastChange");
						SetLastChangeCommand setLastChangeCommand = new SetLastChangeCommand(domain,(Identifiable)obj,date2);
						commands.add(setLastChangeCommand);
						for(int i = 0 ; i< 2 ; i++)
							if(commands.hasPrevious())
								commands.previous(); 
					}
				}
			} catch (RuntimeException exception) {
				// Skip over the command that threw the exception.
				//
				commands.previous();

				try {
					// Iterate back over the executed commands to undo them.
					//
					while (commands.hasPrevious()) {
						Command command = commands.previous();
						if (command.canUndo()) {
							command.undo();
						} else {
							break;
						}
					}
				} catch (RuntimeException nestedException) {
					CommonPlugin.INSTANCE
							.log(new WrappedException(
									CommonPlugin.INSTANCE
											.getString("_UI_IgnoreException_exception"),
									nestedException).fillInStackTrace());
				}

				throw exception;
			}
		}
	}
}
