/*******************************************************************************
 * Copyright (c) 2008 Sonatype, Inc.
 * 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
 *******************************************************************************/

package org.eclipse.m2e.wtp;

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

import org.eclipse.core.resources.IContainer;
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.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;

/**
 * Utility class used to delete generated resources.
 * 
 * @provisional This class has been added as part of a work in progress. 
 * It is not guaranteed to work or remain the same in future releases. 
 * For more information contact <a href="mailto:m2e-wtp-dev@eclipse.org">m2e-wtp-dev@eclipse.org</a>.
 * 
 * @author Fred Bricon
 */
public class ResourceCleaner {
  
  private static final Path EMPTY_PATH = new Path(""); //$NON-NLS-1$

  private final IProject project;

  private List<IFolder> folders = new ArrayList<IFolder>(); 

  private List<IFile> files = new ArrayList<IFile>(); 
  
  private Set<IFolder> keepers = new HashSet<IFolder>();

  /**
   * @param project
   */
  public ResourceCleaner(IProject project) {
    this.project = project;
  }

  public ResourceCleaner(IProject project, IFolder ... foldersToKeep) {
    this.project = project;
    if (foldersToKeep != null) {
      for (IFolder folder : foldersToKeep) {
        if (folder != null) {
          keepers.add(folder);
          IContainer parent = folder.getParent();
          while (parent instanceof IFolder) {
            keepers.add((IFolder)parent);
            parent = parent.getParent();
          }
        }
      }
    }
  }

  
  public void addFolder(IPath folderPath) {
    if (folderPath == null || EMPTY_PATH.equals(folderPath)) {
      return;
    }
    addFolder(project.getFolder(folderPath));
  }

  public void addFolder(IFolder folder) {
    if (folder != null && !folder.exists()) {
      if (!folder.getProject().getFullPath().equals(folder.getFullPath())){
        folders.add(folder);
        addInexistentParentFolders(folder);
      }
    }
  }

  public void addFiles(IPath ... filePaths) {
    if (filePaths == null) {
      return;
    }
    for (IPath fileName : filePaths) {
      IFile fileToDelete = project.getFile(fileName);
      if (!fileToDelete.exists()) {
        files.add(fileToDelete);
        addInexistentParentFolders(fileToDelete);
      }
    }
  }

  public void addFiles(IFile ... filesToDelete) {
    if (filesToDelete == null) {
      return;
    }
    for (IFile fileToDelete : filesToDelete) {
      if (!fileToDelete.exists()) {
        files.add(fileToDelete);
        addInexistentParentFolders(fileToDelete);
      }
    }
  }

  public void cleanUp() throws CoreException {
    IProgressMonitor monitor = new NullProgressMonitor();
    for (IFile file : files) {
      if (file.exists()) {
        file.delete(true, monitor);
      }
    }
    for (IFolder folder : folders) {
      if (folder.exists() && folder.members().length == 0) {
        folder.delete(true, monitor);
      }
    }
  }
  
  protected void addInexistentParentFolders(IResource resource) {
    IContainer parentContainer = resource.getParent();
    while (parentContainer instanceof IFolder) {
      if (keepers.contains(parentContainer) 
          || parentContainer.exists()) {
        break;
      }
      IFolder parent = (IFolder)parentContainer;
      folders.add(parent);
      parentContainer = parentContainer.getParent();
    }
  }
  
}
