/*******************************************************************************
 *                  CHESS core plugin
 *
 *               Copyright (C) 2011-2015
 *            Mälardalen University, Sweden
 *
 *
 *  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-v20.html
 *******************************************************************************/
package org.polarsys.chess.fla.launch;

import java.util.List;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.polarsys.chess.fla.impl.FlaAnalysisRunnerXml;

import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.papyrus.uml.diagram.clazz.part.UMLDiagramEditor;

public class FlaAnalysisCommandXml extends AbstractHandler {

	protected IFile sourceFile;
	List<? extends Object> arguments;
	private IContainer targetFolder;
	
	protected UMLDiagramEditor diagramEditor=null;
	protected DiagramEditPart clazzdiagrameditPart;
	protected PapyrusMultiDiagramEditor papyrusEditor;
	private static JFrame frame = new JFrame();

	public static final String COMMAND_ID = "org.polarsys.chess.fla.analysis.command";
	
	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		sourceFile = handleBrowseFile("Concerto-FLA Analysis from XML", "Please choose source XML file");
		if(sourceFile==null)
			return null;

		if(!sourceFile.getLocation().getFileExtension().equals("xml") && !sourceFile.getLocation().getFileExtension().equals("fla")){
			JOptionPane.showMessageDialog(frame, "Chosen file is not XML file. To perform Concerto-FLA Analysis please choose XML file. " ,"Concerto-FLA Analysis has failed", JOptionPane.ERROR_MESSAGE);
			return null;
		}			
		
		targetFolder = sourceFile.getParent(); 

		Shell shell = new Shell();	
		try {
			ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(shell);
			FlaAnalysisRunnerXml analysisRunner = new FlaAnalysisRunnerXml();
			analysisRunner.setSelectedXmlFile(sourceFile);
			analysisRunner.setTargetFolder(targetFolder);
			pmDialog.run(true, true, analysisRunner);
			
		} catch (InvocationTargetException e) {
			IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
			Activator.getDefault().getLog().log(status);
			throw new ExecutionException("Error during FLA analysis", e);
		} catch (InterruptedException e) {
			IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
			Activator.getDefault().getLog().log(status);
		} 
		return null;
	}
	
	private IFile handleBrowseFile(String title, String message) {

		ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(new Shell(), new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider());

		dialog.setTitle(title);
		dialog.setMessage(message);
		dialog.setAllowMultiple(false);
		dialog.addFilter(new ViewerFilter() {
			@Override
			public boolean select(Viewer viewer, Object parentElement,
					Object element) {
				boolean ret = false;
				String[] extensions = null;
				extensions = new String[] { "xml" };
				try {
					ret = isXMLResource((IResource) element, extensions);
				} catch (CoreException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return ret;
			}
		});
		dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
		dialog.open();

		if(dialog.getReturnCode() == ElementTreeSelectionDialog.CANCEL){
			return null;
		}

		Object results = dialog.getFirstResult();

		if ((results != null) && (results instanceof IFile)) {
			IFile currentFile = (IFile)results;	
			return currentFile;
		}
		else if ((results != null) && ((results instanceof IFolder) || (results instanceof IProject))) {
			JOptionPane.showMessageDialog(frame, "CHESS-FPTC Analysis failed. XML file was not chosed. ","CHESS-FPTC Analysis - Wrong input file", JOptionPane.ERROR_MESSAGE);
			return null;
		}

		return null;
	}

	private static boolean isXMLResource(IResource resource, String[] extensions)
			throws CoreException {
		if (resource instanceof IContainer) {
			if (((IContainer) resource).isAccessible()) {
				IResource[] members = ((IContainer) resource).members();
				for (IResource member : members) {
					if (isXMLResource(member, extensions)) {
						return true;
					}
				}
			}
		} else if (resource instanceof IFile) {
			IFile currentFile = (IFile) resource;
			if (extensions == null) {
				return true;
			} else if (currentFile.getFileExtension() != null) {
				for (int i = 0; i < extensions.length; i++) {
					String extension = extensions[i];
					if (currentFile.getFileExtension().toUpperCase().equals(
							extension.toUpperCase())) {
						return true;
					}
				}
			}
		}
		return false;
	}

	
}