/*******************************************************************************
 * Copyright (c) 2003, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ant.internal.ui.preferences;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.custom.BusyIndicator;

public class FileFilter extends ViewerFilter {

	/**
	 * Objects to filter
	 */
	private List<?> fFilter;

	/**
	 * Collection of files and containers to display
	 */
	private Set<IResource> fFiles;

	private String fExtension;

	private Pattern fExtnPattern;

	private boolean fConsiderExtension = true;

	/**
	 * Creates a new filter that filters the given objects. Note: considerExtension must be called to initialize the filter
	 */
	public FileFilter(List<?> objects, String extension) {
		fFilter = objects;
		fExtension = extension;
		if (extension.indexOf('|') > 0) { // Shouldn't be the first char!
			// This is a pattern; compile and cache it for better performance
			fExtnPattern = Pattern.compile(fExtension, Pattern.CASE_INSENSITIVE);
		} else {
			fExtnPattern = null;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
	 */
	@Override
	public boolean select(Viewer viewer, Object parentElement, Object element) {
		return fFiles.contains(element) && !fFilter.contains(element);
	}

	/**
	 * Search for all the matching files in the workspace.
	 */
	private void init() {
		BusyIndicator.showWhile(AntUIPlugin.getStandardDisplay(), () -> {
			fFiles = new HashSet<>();
			traverse(ResourcesPlugin.getWorkspace().getRoot(), fFiles);
		});
	}

	/**
	 * Traverse the given container, adding files to the given set. Returns whether any files were added
	 */
	private boolean traverse(IContainer container, Set<IResource> set) {
		boolean added = false;
		try {
			IResource[] resources = container.members();
			for (int i = 0; i < resources.length; i++) {
				IResource resource = resources[i];
				if (resource instanceof IFile) {
					IFile file = (IFile) resource;
					String ext = file.getFileExtension();
					if (!fConsiderExtension || canAccept(ext)) {
						set.add(file);
						added = true;
					}
				} else if (resource instanceof IContainer) {
					if (traverse((IContainer) resource, set)) {
						set.add(resource);
						added = true;
					}
				}
			}
		}
		catch (CoreException e) {
			// do nothing
		}
		return added;
	}

	private boolean canAccept(String ext) {
		if (ext != null) {
			if (fExtnPattern == null) {
				// Accepting only a single extension
				return fExtension.equalsIgnoreCase(ext);
			}
			// Accepting multiple extensions
			// eg: "xml|ant|ent|macrodef"
			return fExtnPattern.matcher(ext).matches();
		}
		return false;
	}

	/**
	 * Sets whether this filter will filter based on extension.
	 * 
	 * @param considerExtension
	 *            whether to consider a file's extension when filtering
	 */
	public void considerExtension(boolean considerExtension) {
		fConsiderExtension = considerExtension;
		init();
	}
}