/*******************************************************************************
 * Copyright (c) 2010 BSI Business Systems Integration AG.
 * 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:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.sdk.util.resources;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceProxy;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.scout.sdk.util.internal.SdkUtilActivator;
import org.eclipse.scout.sdk.util.pde.ProductFileModelHelper;

/**
 * <h3>{@link ResourceFilters}</h3> ...
 * 
 * @author Andreas Hoegger
 * @since 3.8.0 14.03.2012
 */
public class ResourceFilters {

  private final static IResourceFilter PRODUCT_FILE_FILTER = getFileExtensionFilter("product");
  private final static IResourceFilter TARGET_FILE_FILTER = getFileExtensionFilter("target");

  /**
   * @param fileName
   *          The filename to search.
   * @param ignoreCase
   *          true if the search should ignore the case of the filename, false if a case-sensitive search should be
   *          performed.
   * @return A new filter that only accepts files with the given name.
   */
  public static IResourceFilter getFileNameFilter(final String fileName, boolean ignoreCase) {
    if (ignoreCase) {
      return new IResourceFilter() {
        @Override
        public boolean accept(IResourceProxy resource) {
          return resource.getType() == IResource.FILE && resource.getName().equalsIgnoreCase(fileName);
        }
      };
    }
    else {
      return new IResourceFilter() {
        @Override
        public boolean accept(IResourceProxy resource) {
          return resource.getType() == IResource.FILE && resource.getName().equals(fileName);
        }
      };
    }
  }

  /**
   * @param fileExtension
   *          The file extension that must be available (without dot).
   * @return creates and returns a filter that only accepts files with the given extension. Consider using one of the
   *         predefined file extension filters: {@link ResourceFilters#getProductFileFilter()},
   *         {@link ResourceFilters#getTargetFileFilter()}.
   */
  public static IResourceFilter getFileExtensionFilter(String fileExtension) {
    final String ext = "." + fileExtension.toLowerCase().trim();
    return new IResourceFilter() {
      @Override
      public boolean accept(IResourceProxy resource) {
        return resource.getType() == IResource.FILE && resource.getName().toLowerCase().endsWith(ext);
      }
    };
  }

  /**
   * @param filters
   *          all of these filters must be fulfilled
   * @return Creates and returns a filter that is fulfilled if all of the given filters are accepted.
   */
  public static IResourceFilter getMultifilterAnd(final IResourceFilter... filters) {
    return getMultifilter(false, filters);
  }

  /**
   * @param filters
   *          at least one of this filter must be fulfilled
   * @return Creates and returns a filter that is fulfilled if a least one of the given filters is accepted.
   */
  public static IResourceFilter getMultifilterOr(final IResourceFilter... filters) {
    return getMultifilter(true, filters);
  }

  private static IResourceFilter getMultifilter(final boolean or, final IResourceFilter... filters) {
    if (filters == null || filters.length < 1) {
      return null; /* no filter. not allowed. */
    }

    return new IResourceFilter() {
      @Override
      public boolean accept(IResourceProxy candidate) {
        for (IResourceFilter f : filters) {
          boolean accepted = f.accept(candidate);
          if (or == accepted) {
            return accepted;
          }
        }
        return !or;
      }
    };
  }

  /**
   * @return Gets a filter that accepts all files that have "product" as file extension.<br>
   *         Calling this method is faster than using {@link ResourceFilters#getFileExtensionFilter(String)}.
   */
  public static IResourceFilter getProductFileFilter() {
    return PRODUCT_FILE_FILTER;
  }

  /**
   * @return Gets a filter that accepts all files that have "target" as file extension.<br>
   *         Calling this method is faster than using {@link ResourceFilters#getFileExtensionFilter(String)}.
   */
  public static IResourceFilter getTargetFileFilter() {
    return TARGET_FILE_FILTER;
  }

  /**
   * Gets all product files that contain the given id as dependency.
   * 
   * @param or
   *          if true, the list of ids is OR connected. Otherwise all of the given ids must be found in the product to
   *          be accepted by this filter (AND).
   * @param pluginOrFeatureIds
   *          The feature ids or plug-in symbolic names
   * @return a filter that returns all product files that fulfill the given criteria.
   */
  public static IResourceFilter getProductFileByContentFilter(final boolean or, final String... pluginOrFeatureIds) {
    final IResourceFilter productFileContentFilter = new IResourceFilter() {
      @Override
      public boolean accept(IResourceProxy resource) {
        // resource must be a product file here
        IFile productFile = (IFile) resource.requestResource();
        try {
          ProductFileModelHelper pfmh = new ProductFileModelHelper(productFile);
          for (String id : pluginOrFeatureIds) {
            boolean exists = pfmh.ProductFile.existsDependency(id);
            if (or == exists) {
              return exists;
            }
          }
        }
        catch (CoreException e) {
          SdkUtilActivator.logError("Unable to parse content of product file '" + productFile.getFullPath().toOSString() + "'.", e);
        }
        return !or;
      }
    };
    return getMultifilterAnd(getProductFileFilter(), productFileContentFilter);
  }
}
