/*******************************************************************************
 * Copyright (c) 2011, 2012 Red Hat, Inc.
 *  All rights reserved.
 * This program is 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:
 * Red Hat, Inc. - initial API and implementation
 *
 * @author Bob Brodt
 ******************************************************************************/
package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;

import org.eclipse.bpmn2.Activity;
import org.eclipse.bpmn2.DataInput;
import org.eclipse.bpmn2.DataOutput;
import org.eclipse.bpmn2.Event;
import org.eclipse.bpmn2.Expression;
import org.eclipse.bpmn2.Gateway;
import org.eclipse.bpmn2.Interface;
import org.eclipse.bpmn2.ItemDefinition;
import org.eclipse.bpmn2.ManualTask;
import org.eclipse.bpmn2.Message;
import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
import org.eclipse.bpmn2.Operation;
import org.eclipse.bpmn2.ReceiveTask;
import org.eclipse.bpmn2.ScriptTask;
import org.eclipse.bpmn2.SendTask;
import org.eclipse.bpmn2.SequenceFlow;
import org.eclipse.bpmn2.Task;
import org.eclipse.bpmn2.modeler.core.IBpmn2RuntimeExtension;
import org.eclipse.bpmn2.modeler.core.LifecycleEvent;
import org.eclipse.bpmn2.modeler.core.LifecycleEvent.EventType;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
import org.eclipse.bpmn2.modeler.core.runtime.CustomTaskDescriptor;
import org.eclipse.bpmn2.modeler.core.runtime.CustomTaskImageProvider;
import org.eclipse.bpmn2.modeler.core.runtime.ModelExtensionDescriptor.Property;
import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features.JbpmCustomTaskFeatureContainer;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.GlobalType;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.ImportType;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmActivityDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmCommonEventDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmDataAssociationDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmDataItemsPropertySection.GlobalTypeDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmDefinitionsPropertySection.JbpmMessageDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmDefinitionsPropertySection.JbpmMessageListComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmExpressionDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmGatewayDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmImportTypeDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmInterfaceDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmItemDefinitionDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmItemDefinitionListComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmManualTaskDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmMultiInstanceDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmOperationDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmReceiveTaskDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmScriptTaskDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmSendTaskDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmSequenceFlowDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.JbpmTaskDetailComposite;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid.WIDException;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid.WIDHandler;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid.WorkItemDefinition;
import org.eclipse.bpmn2.modeler.ui.DefaultBpmn2RuntimeExtension.RootElementParser;
import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
import org.eclipse.bpmn2.modeler.ui.wizards.FileService;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.xml.sax.InputSource;

public class JBPM5RuntimeExtension implements IBpmn2RuntimeExtension {
	
	public final static String JBPM5_RUNTIME_ID = "org.jboss.runtime.jbpm5"; //$NON-NLS-1$
	
	private static final String DROOLS_NAMESPACE = "http://www.jboss.org/drools"; //$NON-NLS-1$
	private List<WorkItemDefinition> workItemDefinitions;
	
	/* (non-Javadoc)
	 * Check if the given input file is a drools-generated (jBPM) process file.
	 * 
	 * @see org.eclipse.bpmn2.modeler.core.IBpmn2RuntimeExtension#isContentForRuntime(org.eclipse.core.resources.IFile)
	 */
	@Override
	public boolean isContentForRuntime(IEditorInput input) {
		InputSource source = new InputSource( FileService.getInputContents(input) );
		RootElementParser parser = new RootElementParser(DROOLS_NAMESPACE);
		parser.parse(source);
		return parser.getResult();
	}

	public String getTargetNamespace(Bpmn2DiagramType diagramType){
		return DROOLS_NAMESPACE;
	}

	public List<WorkItemDefinition> getWorkItemDefinitions() {
		if (workItemDefinitions==null)
			workItemDefinitions = new ArrayList<WorkItemDefinition>();
		return workItemDefinitions;
	}

	public WorkItemDefinition getWorkItemDefinition(String taskName) {
		List<WorkItemDefinition> wids = getWorkItemDefinitions();
		for (WorkItemDefinition wid : wids) {
			if (taskName.equals(wid.getName())) {
				return wid;
			}
		}
		return null;
	}
	
	@Override
	public void notify(LifecycleEvent event) {
		if (event.eventType == EventType.EDITOR_INITIALIZED) {
			// Register all of our Property Tab Detail overrides here. 
	        PropertiesCompositeFactory.register(Activity.class, JbpmActivityDetailComposite.class);
	        PropertiesCompositeFactory.register(DataInput.class, JbpmDataAssociationDetailComposite.class);
	        PropertiesCompositeFactory.register(DataOutput.class, JbpmDataAssociationDetailComposite.class);
	        PropertiesCompositeFactory.register(Event.class, JbpmCommonEventDetailComposite.class);
	        PropertiesCompositeFactory.register(Gateway.class, JbpmGatewayDetailComposite.class);
	        PropertiesCompositeFactory.register(GlobalType.class, GlobalTypeDetailComposite.class);
	        PropertiesCompositeFactory.register(ImportType.class, JbpmImportTypeDetailComposite.class);
	        PropertiesCompositeFactory.register(ItemDefinition.class, JbpmItemDefinitionListComposite.class);
	        PropertiesCompositeFactory.register(ManualTask.class, JbpmManualTaskDetailComposite.class);
	        PropertiesCompositeFactory.register(Message.class, JbpmMessageDetailComposite.class);
	        PropertiesCompositeFactory.register(Message.class, JbpmMessageListComposite.class);
	        PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, JbpmMultiInstanceDetailComposite.class);
	        PropertiesCompositeFactory.register(ReceiveTask.class, JbpmReceiveTaskDetailComposite.class);
	        PropertiesCompositeFactory.register(ScriptTask.class, JbpmScriptTaskDetailComposite.class);
	        PropertiesCompositeFactory.register(SendTask.class, JbpmSendTaskDetailComposite.class);
	        PropertiesCompositeFactory.register(SequenceFlow.class, JbpmSequenceFlowDetailComposite.class);
	        PropertiesCompositeFactory.register(Task.class, JbpmTaskDetailComposite.class);
			PropertiesCompositeFactory.register(ItemDefinition.class, JbpmItemDefinitionDetailComposite.class);
			PropertiesCompositeFactory.register(Interface.class, JbpmInterfaceDetailComposite.class);
			PropertiesCompositeFactory.register(Operation.class, JbpmOperationDetailComposite.class);
			PropertiesCompositeFactory.register(Expression.class, JbpmExpressionDetailComposite.class);

			// TODO: if file was opened from a Guvnor Repository view (or git in jBPM 6)
			// we may want to explicitly make the editor read-only
	
			IFile inputFile = ((BPMN2Editor) event.target).getModelFile();
			if (inputFile!=null) {
				IContainer folder = inputFile.getParent();

				// initialize workItemDefinitions list if necessary
				getWorkItemDefinitions();
				workItemDefinitions.clear();
				try {
					final WIDResourceVisitor visitor = new WIDResourceVisitor();
					folder.accept(visitor, IResource.DEPTH_INFINITE, false);
					if (visitor.getWIDFiles().size() > 0) {
						Iterator<IFile> fileIter = visitor.getWIDFiles().iterator();
						while (fileIter.hasNext()) {
							IFile file = fileIter.next();
							HashMap<String, WorkItemDefinition> widMap = 
									new LinkedHashMap<String, WorkItemDefinition>();
							WIDHandler.evaluateWorkDefinitions(widMap, file);
							workItemDefinitions.addAll(widMap.values());
						}
					}
					if (!workItemDefinitions.isEmpty()) {
						List<CustomTaskDescriptor> removed = new ArrayList<CustomTaskDescriptor>();
						for (CustomTaskDescriptor d : TargetRuntime.getCurrentRuntime().getCustomTaskDescriptors()) {
							if (!d.isPermanent())
								removed.add(d);
						}
						TargetRuntime.getCurrentRuntime().getCustomTaskDescriptors().removeAll(removed);
					
						java.util.Iterator<WorkItemDefinition> widIterator = workItemDefinitions.iterator();
						while(widIterator.hasNext()) {
							final WorkItemDefinition wid = widIterator.next();
							final CustomTaskDescriptor ctd = convertWIDtoCT(wid);
							if (ctd != null) {
								if (TargetRuntime.getCurrentRuntime().customTaskExists(ctd.getId())) {
									Display.getDefault().asyncExec( new Runnable() {
										@Override
										public void run() {
											MessageDialog.openError(Display.getDefault().getActiveShell(),
													Messages.JBPM5RuntimeExtension_Duplicate_Task_Title,
													NLS.bind(
														Messages.JBPM5RuntimeExtension_Duplicate_Task_Message,
														ctd.getId(),
														wid.getDefinitionFile().getFullPath().toString())
												);
										}
									});
								}
								else
									TargetRuntime.getCurrentRuntime().addCustomTask(ctd);
							}
						}
					}
				} catch (CoreException e) {
					e.printStackTrace();
				} catch (WIDException e) {
					e.printStackTrace();
				}
			}
		}
		else if (event.eventType == EventType.BUSINESSOBJECT_CREATED) {
			EObject object = (EObject) event.target;
			// Add a name change adapter to every one of these objects.
			// See my rant in ProcessVariableNameChangeAdapter...
			if (ProcessVariableNameChangeAdapter.appliesTo(object)) {
				ProcessVariableNameChangeAdapter.adapt(object);
			}
			else if (MetaDataTypeAdapter.appliesTo(object)) {
				MetaDataTypeAdapter.adapt(object);
			}
		}
	}
	
	/*
	 * Convert a WID to a CustomTaskDescriptor
	 * @param wid
	 * @return
	 */
	private CustomTaskDescriptor convertWIDtoCT ( WorkItemDefinition wid ) {
		if (wid != null) {
			String id = wid.getName();
			String name = wid.getDisplayName();
			CustomTaskDescriptor ct = new CustomTaskDescriptor(id,name);
			ct.setType("Task"); //$NON-NLS-1$
			ct.setDescription(wid.getDescription());
			ct.setCategory(wid.getCategory());
			ct.setFeatureContainer(new JbpmCustomTaskFeatureContainer());
			ct.getFeatureContainer().setCustomTaskDescriptor(ct);
			ct.getFeatureContainer().setId(id);
			
			// process basic properties here
			setBasicProps ( ct, wid);
			
			// push the icon into the image registry
			IProject project = Bpmn2Preferences.getActiveProject();
			String iconPath = getWIDPropertyValue("icon", wid); //$NON-NLS-1$
			if (iconPath != null) {
				Path tempPath = new Path(iconPath);
				String iconName = tempPath.lastSegment();
				IconResourceVisitor visitor = new IconResourceVisitor(iconName);
				try {
					project.accept(visitor, IResource.DEPTH_INFINITE, false);
					if (visitor.getIconResources() != null && visitor.getIconResources().size() > 0) {
						ArrayList<IResource> icons = visitor.getIconResources();
						IResource icon = icons.get(0);
						URL url = icon.getLocationURI().toURL();
						ImageDescriptor image = ImageDescriptor.createFromURL(url);
						CustomTaskImageProvider.registerImage(iconPath, image);
					}
				} catch (CoreException e1) {
					e1.printStackTrace();
				} catch (MalformedURLException e) {
					e.printStackTrace();
				}
			}
			
			// process xml properties here - i.e. task variables
			Property ioSpecification = createIOSpecificationSection(ct, wid);
			createDataAssociations(ioSpecification, ct);
			
			return ct;
		}
		return null;
	}
	
	/*
	 * Process the high-level props
	 * @param propName
	 * @param wid
	 * @return
	 */
	private String getWIDPropertyValue ( String propName, WorkItemDefinition wid) {
		if (propName.equalsIgnoreCase("taskname")) { //$NON-NLS-1$
			return wid.getName();
		}
		if (propName.equalsIgnoreCase("displayName")) { //$NON-NLS-1$
			return wid.getDisplayName();
		}
		if (propName.equalsIgnoreCase("icon")) { //$NON-NLS-1$
			return wid.getIcon();
		}
		if (propName.equalsIgnoreCase("customEditor")) { //$NON-NLS-1$
			return wid.getCustomEditor();
		}
		if (propName.equalsIgnoreCase("eclipse:customEditor")) { //$NON-NLS-1$
			return wid.getEclipseCustomEditor();
		}
		return null;
	}
	
	/*
	 * Get the high-level prop from the WID
	 * @param propName
	 * @param wid
	 * @return
	 */
	private Property getPropertyFromWID ( String propName, WorkItemDefinition wid ) {
		String name = propName;
		String value = getWIDPropertyValue(propName, wid);
		String description = null;
		String type = "EString"; //$NON-NLS-1$
		Property prop = new Property(null, name, description);
		prop.type = type;
		if (value == null && propName.equalsIgnoreCase("icon")) { //$NON-NLS-1$
			value = "task.png"; //$NON-NLS-1$
		}
		if (value!=null)
			prop.getValues().add(value);
		return prop;
	}
	
	/*
	 * Create the input and output data associations
	 * @param ioSpecification
	 * @param ct
	 */
	private void createDataAssociations ( Property ioSpecification, CustomTaskDescriptor ct) {
		Object[] values = ioSpecification.getValues().toArray();
		int inputCounter = -1;
//		int outputCounter = -1;
		for (int i = 0; i < values.length; i++) {
			if (values[i] instanceof Property) {
				Property prop = (Property) values[i];
				if (prop.name.equals("dataInputs")) { //$NON-NLS-1$
					inputCounter++;
					Property dataInputAssociations = new Property (prop, "dataInputAssociations", null); //$NON-NLS-1$
					Property targetRef = new Property (dataInputAssociations, "targetRef", null); //$NON-NLS-1$
					targetRef.ref = "ioSpecification/dataInputs#" + inputCounter; //$NON-NLS-1$
					dataInputAssociations.getValues().add(targetRef);
					ct.getProperties().add(dataInputAssociations);
				}
//				} else 	if (prop.name.equals("dataOutputs")) {
//					outputCounter++;
//					Property dataOutputAssociations = new Property ( "dataOutputAssociations", null);
//					Property sourceRef = new Property ("sourceRef", null);
//					sourceRef.ref = "ioSpecification/dataOutputs#" + outputCounter;
//					dataOutputAssociations.getValues().add(sourceRef);
////					Property targetRef = new Property ("targetRef", null);
////					dataOutputAssociations.getValues().add(targetRef);
//					ct.getProperties().add(dataOutputAssociations);
//				}

			}
		}
	}
	
	/*
	 * Handle creating the ioSpecification from the WID/CT
	 * @param ct
	 * @param wid
	 */
	private Property createIOSpecificationSection ( CustomTaskDescriptor ct, WorkItemDefinition wid ) {
		Property ioSpecification = new Property (null,"ioSpecification", null); //$NON-NLS-1$
		
		for (Entry<String, String> entry : wid.getParameters().entrySet()) {
			Property dataInputs = new Property(ioSpecification,"dataInputs", null); //$NON-NLS-1$
			Property dataInputsName = new Property(dataInputs,"name", null); //$NON-NLS-1$
			dataInputsName.getValues().add(entry.getKey());
			dataInputs.getValues().add(dataInputsName);
			ioSpecification.getValues().add(dataInputs);
		}

		// this code if enabled will create a default output variable
		
//		if (wid.getResults().isEmpty()) {
//			Property dataOutputs = new Property("dataOutputs", null);
//			Property dataOutputsName = new Property("name", null);
//			dataOutputsName.getValues().add("result");
//			dataOutputs.getValues().add(dataOutputsName);
//			ioSpecification.getValues().add(dataOutputs);
//		} else {
			for (Entry<String, String> entry : wid.getResults().entrySet()) {
				Property dataOutputs = new Property(ioSpecification,"dataOutputs", null); //$NON-NLS-1$
				Property dataOutputsName = new Property(dataOutputs,"name", null); //$NON-NLS-1$
				dataOutputsName.getValues().add(entry.getKey());
				dataOutputs.getValues().add(dataOutputsName);
				ioSpecification.getValues().add(dataOutputs);
			}
//		}

		Object[] values = ioSpecification.getValues().toArray();
		int inputCounter = -1;
		int outputCounter = -1;
		Property inputSets = new Property(ioSpecification,"inputSets", null); //$NON-NLS-1$
		Property outputSets = new Property(ioSpecification,"outputSets", null); //$NON-NLS-1$
		for (int i = 0; i < values.length; i++) {
			if (values[i] instanceof Property) {
				Property prop = (Property) values[i];
				if (prop.name.equals("dataInputs")) { //$NON-NLS-1$
					inputCounter++;
					Property inputSetsRef = new Property (inputSets,"dataInputRefs", null); //$NON-NLS-1$
					inputSetsRef.ref = "ioSpecification/dataInputs#" + inputCounter; //$NON-NLS-1$
					inputSets.getValues().add(inputSetsRef);
				} else 	if (prop.name.equals("dataOutputs")) { //$NON-NLS-1$
					outputCounter++;
					Property outputSetsRef = new Property (outputSets,"dataOutputRefs", null); //$NON-NLS-1$
					outputSetsRef.ref = "ioSpecification/dataOutputs#" + outputCounter; //$NON-NLS-1$
					outputSets.getValues().add(outputSetsRef);
				}
			}
		}
		if (inputSets.getValues().size() > 0) 
			ioSpecification.getValues().add(inputSets);
		if (outputSets.getValues().size() > 0) 
			ioSpecification.getValues().add(outputSets);
		
		ct.getProperties().add(ioSpecification);
		return ioSpecification;
	}
	
	/*
	 * Handle the top-level props
	 * @param ct
	 * @param wid
	 */
	private void setBasicProps ( CustomTaskDescriptor ct, WorkItemDefinition wid) {
		String[] basicProps = new String[] { "taskName", "displayName", "icon" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		for (int i = 0; i < basicProps.length; i++) {
			Property prop = getPropertyFromWID(basicProps[i], wid);
			ct.getProperties().add(prop);
		}
	}

	/*
	 * Class: Visits each file in the project to see if it's a *.conf/*.wid
	 * @author bfitzpat
	 *
	 */
	private class WIDResourceVisitor implements IResourceVisitor {
		
		private ArrayList<IFile> widFiles = new ArrayList<IFile>();
		
		public boolean visit (IResource resource) throws CoreException {
			if (resource.getType() == IResource.FILE) {
				if ("conf".equalsIgnoreCase(((IFile)resource).getFileExtension()) || //$NON-NLS-1$
						"wid".equalsIgnoreCase(((IFile)resource).getFileExtension())) { //$NON-NLS-1$
					widFiles.add((IFile)resource);
					return true;
				}
			}
			else if (resource.getType() == IResource.FOLDER) {
				// skip over "bin" and "target" folders
				String name = resource.getName();
				if ("bin".equals(name) || "target".equals(name)) //$NON-NLS-1$ //$NON-NLS-2$
					return false;
			}
			return true;
		}
		
		public ArrayList<IFile> getWIDFiles() {
			return widFiles;
		}
	}
	
	/*
	 * Class: Visits each file in the project looking for the icon
	 * @author bfitzpat
	 *
	 */
	private class IconResourceVisitor implements IResourceVisitor {
		
		private ArrayList<IResource> iconResources = new ArrayList<IResource>();
		private String iconName;
		
		public IconResourceVisitor ( String iconName ) {
			this.iconName = iconName;
		}
		
		public boolean visit (IResource resource) throws CoreException {
			if (resource.getType() == IResource.FILE) {
				if (((IFile)resource).getName().equalsIgnoreCase(iconName)) {
					iconResources.add(resource);
					return true;
				}
			}
			return true;
		}
		
		public ArrayList<IResource> getIconResources() {
			return iconResources;
		}
	}
}
