//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.actions;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.eclipse.emf.edit.ui.EMFEditUIPlugin;
import org.eclipse.emf.edit.ui.action.ValidateAction;
import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
import org.eclipse.epf.authoring.ui.views.ConfigurationView;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.DependencyValidationMgr;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.NamedElement;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.epf.validation.LibraryEValidator;
import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy;
import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy.LibraryIterator;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ISetSelectionTarget;

/**
 * @author Phong Nguyen Le
 * @since  1.0
 */
public class LibraryValidateAction extends ValidateAction {
	private HashSet resources;
	private boolean success;
	private boolean showSuccess = true;
	private Map contextData = new HashMap();

	public LibraryValidateAction() {
		super();
		eclipseResourcesUtil = new LibraryValidationMarkerHelper();
	}
	
	public LibraryValidateAction(boolean showSuccess) {
		this();
		this.showSuccess  = showSuccess;
	}
	
	public void putContextData(Object key, Object value) {
		contextData.put(key, value);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.emf.edit.ui.action.ValidateAction#validate(org.eclipse.core.runtime.IProgressMonitor)
	 */
	protected Diagnostic validate(final IProgressMonitor progressMonitor) {
	    if(resources == null) {
	    	resources = new HashSet();
	    }
	    else {
	    	resources.clear();
	    }
	    boolean dependencyInfoMgrSet = false;
		Collection eObjects = new ArrayList();
		for (Iterator iter = selectedObjects.iterator(); iter.hasNext();) {
			Object element = TngUtil.unwrap(iter.next());
			if(element instanceof EObject) {
				eObjects.add(element);
				Resource resource = ((EObject)element).eResource();
				if(resource != null) {
					resources.add(resource);
				}
				if (! dependencyInfoMgrSet && element instanceof MethodElement) {
					MethodLibrary lib = UmaUtil.getMethodLibrary((MethodElement) element);	
					putContextData(LibraryEValidator.CTX_DEPENDENCY_VALIDATION_MGR, new DependencyValidationMgr(lib));
					dependencyInfoMgrSet = true;
				}
			}
		}
		
	    int count = eObjects.size();
	    eObjects = LibraryTraversalStrategy.makeTargetsDisjoint(eObjects);
		LibraryIterator libIter = new LibraryIterator(eObjects, true, LibraryTraversalStrategy.DEEP, true);
		while(libIter.hasNext()) {
			Object o = libIter.next();
			count++;
			if(o instanceof EObject) {
				Resource resource = ((EObject)o).eResource();
				if(resource != null) {
					resources.add(resource);
				}
				
				if(o instanceof NamedElement) {
					NamedElement e = (NamedElement) o;
					System.out.println(TngUtil.getTypeText(e) + ": '" + e.getName() + "'");
				}
			}
		}
		
	    progressMonitor.beginTask("", count);

//	    final AdapterFactory adapterFactory = 
//	      domain instanceof AdapterFactoryEditingDomain ? ((AdapterFactoryEditingDomain)domain).getAdapterFactory() : null;

	    Diagnostician diagnostician = 
	      new Diagnostician()
	      {
	        public String getObjectLabel(EObject eObject)
	        {
//	          if (adapterFactory != null && !eObject.eIsProxy())
//	          {
//	            IItemLabelProvider itemLabelProvider = (IItemLabelProvider)adapterFactory.adapt(eObject, IItemLabelProvider.class);
//	            if (itemLabelProvider != null)
//	            {
//	              return itemLabelProvider.getText(eObject);
//	            }
//	          }
//	  
//	          return super.getObjectLabel(eObject);
	        	
	        	return TngUtil.getLabelWithPath(eObject);
	        }

	        public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map context)
	        {
	          progressMonitor.worked(1);
	          if(context == null) {
	        	  context = contextData;	        	  
	          }
	          else {
	        	  context.putAll(contextData);
	          }
	          return super.validate(eClass, eObject, diagnostics, context);
	        }	        
	        
	      };
	      
	      List list = new ArrayList(eObjects);
	      int max = list.size() - 1;
	      StringBuffer strBuf = new StringBuffer();
	      for (int i = 0; i < max; i++) {
	    	  Object e = list.get(i);
	    	  if(e instanceof NamedElement) {
	    		  strBuf.append(((NamedElement)e).getName()).append(", "); //$NON-NLS-1$
	    	  }
	      }
	      Object e = max < 0 ? null : list.get(max);
	      if(e instanceof NamedElement) {
    		  strBuf.append(((NamedElement)e).getName());
    	  }
	      BasicDiagnostic diagnostics = 
	          new BasicDiagnostic
	            (EObjectValidator.DIAGNOSTIC_SOURCE,
	             0,
	             EcorePlugin.INSTANCE.getString
	               ("_UI_DiagnosticRoot_diagnostic", //$NON-NLS-1$ 
	                new Object [] { strBuf.toString() }), //$NON-NLS-1$
	             list.toArray());
	      for (Iterator iter = eObjects.iterator(); iter.hasNext();) {
	    	  EObject eObject = (EObject) iter.next();
	    	  progressMonitor.setTaskName
	    	  (EMFEditUIPlugin.INSTANCE.getString("_UI_Validating_message", new Object [] {diagnostician.getObjectLabel(eObject)}));
	    	  diagnostician.validate(eObject, diagnostics);
	      }
	      success = diagnostics.getSeverity() == Diagnostic.OK;
	      return diagnostics;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.emf.edit.ui.action.ValidateAction#handleDiagnostic(org.eclipse.emf.common.util.Diagnostic)
	 */
	protected void handleDiagnostic(Diagnostic diagnostic) {
		if(diagnostic != null) {
			if(showSuccess || !isSuccessful()) {
				// save the reference to EclipseResourcesUtil and set eclipseResourcesUtil to null
				// so super method will not try to deal with the markers
				//
				EclipseResourcesUtil savedRef = eclipseResourcesUtil;
				eclipseResourcesUtil = null;
				try {
					super.handleDiagnostic(diagnostic);
				}
				finally {
					eclipseResourcesUtil = savedRef;
				}
			}
			
			// dealing with markers
			//
			if (eclipseResourcesUtil != null)				
			{
				// delete old markers
				//					
				for (Iterator iter = resources.iterator(); iter.hasNext();) {
					eclipseResourcesUtil.deleteMarkers((Resource) iter.next());
				}
				
				Viewer viewer = null;
				if (!diagnostic.getChildren().isEmpty())
				{
					Map diagnosticToResourceMap = new HashMap();
					for (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); )
					{
						Diagnostic childDiagnostic = (Diagnostic)i.next();
						List data = childDiagnostic.getData();
						if (!data.isEmpty()) {
							Object o = data.get(0);
							if(o instanceof EObject) {
								Resource resource = ((EObject)o).eResource();
								if(resource != null) {
									diagnosticToResourceMap.put(childDiagnostic, resource);
								}
							}
						}
					}
										
					// create markers
					//
					for (Iterator i = diagnosticToResourceMap.entrySet().iterator(); i.hasNext(); )
					{
						Map.Entry entry = (Entry) i.next();
						Diagnostic childDiagnostic = (Diagnostic)entry.getKey();
						Resource resource = (Resource) entry.getValue();
						eclipseResourcesUtil.createMarkers(resource, childDiagnostic);
					}
					
					// select the first object with problem in the viewer if possible
					//
					List data = ((Diagnostic)diagnostic.getChildren().get(0)).getData();
					if (!data.isEmpty())
					{
						Object part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();						
						Object e = data.get(0);
						if (part instanceof ISetSelectionTarget)
						{
							((ISetSelectionTarget)part).selectReveal(new StructuredSelection(e));
						}
						else if (part instanceof IViewerProvider)
						{
							viewer = ((IViewerProvider)part).getViewer();
							if (viewer != null)
							{
								viewer.setSelection(new StructuredSelection(data.get(0)), true);
							}
						}
					}					
				}
				if(viewer == null) {
					Object part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
					if (part instanceof IViewerProvider)
					{
						viewer = ((IViewerProvider)part).getViewer();
					}
				}
				if(viewer != null) {
					viewer.refresh();
				}
				
				try {
					refreshViews();
				}
				catch(Exception e) {
					
				}
			}
		}
	}
	
	protected void refreshViews() {
		ConfigurationView.getView().getViewer().refresh();
	}

	public boolean isSuccessful() {
		return success;
	}
}
