/**
 * <copyright>
 *
 *  Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 *  This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-v2.0.
 *
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 *      Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.dev.pattern.actions;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

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.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.egf.common.ui.helper.ThrowableHandler;
import org.eclipse.egf.core.domain.EgfResourceSet;
import org.eclipse.egf.core.fcore.IPlatformFcore;
import org.eclipse.egf.core.fcore.IPlatformFcoreProvider;
import org.eclipse.egf.core.pattern.PatternFolders;
import org.eclipse.egf.core.platform.EGFPlatformPlugin;
import org.eclipse.egf.dev.Activator;
import org.eclipse.egf.model.pattern.Pattern;
import org.eclipse.egf.model.pattern.PatternMethod;
import org.eclipse.egf.model.pattern.template.TemplateModelFileHelper;
import org.eclipse.egf.pattern.collector.PatternCollector;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;

/**
 * @author Matthieu Helleboid
 * 
 */
public class DeleteUnusedTemplatesAction implements IWorkbenchWindowActionDelegate {

	public DeleteUnusedTemplatesAction() {
		// Nothing to do
	}

	public void run(IAction action) {
		final List<Pattern> patterns = new ArrayList<Pattern>(200);
		Set<IFolder> folders = new HashSet<IFolder>();

		IPlatformFcore[] platformFcores = EGFPlatformPlugin.getPlatformManager().getWorkspacePlatformExtensionPoints(IPlatformFcore.class);
		ResourceSet resourceSet = new EgfResourceSet();
		try {
			for (IPlatformFcore platformFcore : platformFcores) {
				URI uri = platformFcore.getURI();
				Resource res = resourceSet.getResource(uri, true);
				PatternCollector.INSTANCE.collect(res.getContents(), patterns, PatternCollector.EMPTY_ID_SET);

				IProject project = platformFcore.getPlatformBundle().getProject();
				IFolder folder = project.getFolder(PatternFolders.getTemplatesFolderName());
				if (folder.exists())
					folders.add(folder);
			}

			for (IFolder folder : folders) {

				folder.accept(new IResourceVisitor() {

					public boolean visit(IResource resource) throws CoreException {
						if (resource.getType() == IResource.FILE) {
							if (TemplateModelFileHelper.PATTERN_UNIT_FILE_EXTENSION.equals(resource.getFileExtension())) {
								if (!found(patterns, resource)) {
									delete(resource);
									if (resource.getParent().getType() == IResource.FOLDER) {
										IFolder innerFolder = (IFolder) resource.getParent();
										if (innerFolder.members().length == 0)
											delete(innerFolder);
									}
								}
							}
							return false;
						}
						return true;
					}

					private void delete(IResource resource) throws CoreException {
						Activator.getDefault().logInfo("Will delete " + resource); //$NON-NLS-1$
						resource.delete(true, new NullProgressMonitor());
					}

					private boolean found(final List<Pattern> innerPatterns, IResource resource) {
						for (Pattern pattern : innerPatterns) {
							IProject project = ((IPlatformFcoreProvider) pattern.eResource()).getIPlatformFcore().getPlatformBundle().getProject();
							if (project.equals(resource.getProject())) {
								for (PatternMethod method : pattern.getMethods()) {
									IFile methodFile = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(method.getPatternFilePath().toPlatformString(true));
									if (methodFile != null && methodFile.equals(resource)) {
										return true;
									}
								}
							}
						}
						return false;
					}

				});

			}
		} catch (Throwable t) {
			ThrowableHandler.handleThrowable(Activator.getDefault().getPluginID(), t);
		}
		Activator.getDefault().logInfo("finished"); //$NON-NLS-1$
	}

	/**
	 * Selection in the workbench has been changed. We
	 * can change the state of the 'real' action here
	 * if we want, but this can only happen after
	 * the delegate has been created.
	 * 
	 * @see IWorkbenchWindowActionDelegate#selectionChanged
	 */
	public void selectionChanged(IAction action, ISelection selection) {
		// Nothing to do
	}

	/**
	 * We can use this method to dispose of any system
	 * resources we previously allocated.
	 * 
	 * @see IWorkbenchWindowActionDelegate#dispose
	 */
	public void dispose() {
		// Nothing to do
	}

	/**
	 * We will cache window object in order to
	 * be able to provide parent shell for the message dialog.
	 * 
	 * @see IWorkbenchWindowActionDelegate#init
	 */
	public void init(IWorkbenchWindow window) {
		// Nothing to do
	}

}
