/*
 * Copyright (c) 2010-2012 Eike Stepper (Berlin, Germany) 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:
 *    Martin Fluegge - initial API and implementation
 */
package org.eclipse.emf.cdo.dawn.codegen.util;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
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;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.actions.WorkspaceModifyOperation;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

/**
 * @author Martin Fluegge
 */
public class ProjectCreationHelper
{

  private String name;

  private String[] natures;

  public String getName()
  {
    return name;
  }

  public IProject getProject()
  {
    return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
  }

  public IProject createProject() throws CoreException
  {
    IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);

    if (!project.exists())
    {
      project.create(null);
    }

    if (!project.isOpen())
    {
      project.open(null);
    }

    IProjectDescription description = project.getDescription();
    description.setNatureIds(natures);
    project.setDescription(description, null);

    return project;
  }

  /**
   * @param path
   * @param javaProject
   * @throws JavaModelException
   */
  public static void addJarToBuildPath(String path, IJavaProject javaProject) throws JavaModelException
  {
    IClasspathEntry newLibraryEntry = JavaCore.newLibraryEntry(new Path(path), null, null);
    ProjectCreationHelper.addToClasspath(javaProject, newLibraryEntry);
  }

  public static void addJarToBuildPath(IPath path, IJavaProject javaProject) throws JavaModelException
  {
    IClasspathEntry newLibraryEntry = JavaCore.newLibraryEntry(path, null, null);
    ProjectCreationHelper.addToClasspath(javaProject, newLibraryEntry);
  }

  public static void addVariableEntryToBuildPath(IPath path, IJavaProject javaProject) throws JavaModelException
  {
    IClasspathEntry newLibraryEntry = JavaCore.newVariableEntry(path, null, null);
    ProjectCreationHelper.addToClasspath(javaProject, newLibraryEntry);
  }

  /**
   * adds all jar files in this folder to the build path. Searches only on level 1
   *
   * @param folder
   *          the folder which contains the jar files
   * @param javaProject
   * @throws CoreException
   */
  public static void addAllJarsToBuildPath(IFolder folder, IJavaProject javaProject) throws CoreException
  {
    try
    {
      folder.refreshLocal(100, new NullProgressMonitor());
      for (IResource resource : folder.members())
      {

        if (resource instanceof IFile && resource.getRawLocation().toString().endsWith(".jar"))
        {
          addJarToBuildPath(resource.getRawLocation(), javaProject);
        }
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  /**
   * @param javaProject
   * @param newEntry
   * @throws JavaModelException
   */
  public final static void addToClasspath(IJavaProject javaProject, IClasspathEntry newEntry) throws JavaModelException
  {
    if (newEntry == null)
    {
      return;
    }
    IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
    IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
    System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);

    newEntries[oldEntries.length] = newEntry;
    javaProject.setRawClasspath(newEntries, null);
  }

  /**
   * @param javaProject
   * @param toBeRemoved
   * @throws JavaModelException
   */
  public final static void removeFromClasspath(IJavaProject javaProject, IPath toBeRemoved) throws JavaModelException
  {
    IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
    ArrayList<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>();

    for (IClasspathEntry classpathEntry : oldEntries)
    {
      if (!classpathEntry.getPath().equals(toBeRemoved))
      {
        newEntries.add(classpathEntry);
      }
    }

    IClasspathEntry[] newEntriesArray = new IClasspathEntry[newEntries.size()];
    javaProject.setRawClasspath(newEntries.toArray(newEntriesArray), null);
  }

  /**
   * @return the newly created java project
   * @throws CoreException
   */
  public IJavaProject createJavaProject() throws CoreException
  {
    IProject project = createProject();
    return createJavaProject(project);
  }

  /**
   * Creates a JavaProject prom the given project
   *
   * @param project
   * @return the created JavaProject
   */
  public IJavaProject createJavaProject(IProject project)
  {
    try
    {
      // addJavaNature(project);
      IJavaProject javaProject = JavaCore.create(project);
      if (!javaProject.isOpen())
      {
        javaProject.open(null);
      }
      createBinFolder(project, javaProject);
      clearSourcePath(javaProject);

      IClasspathEntry sourceFolder = createSourceFolder("src", project);

      addToClasspath(javaProject, sourceFolder);
      addJREContainerToProject(javaProject);
      return javaProject;
    }
    catch (CoreException e)
    {
      e.printStackTrace();
    }
    return null;

  }

  /**
   * @param javaProject
   * @throws JavaModelException
   */
  private void addJREContainerToProject(IJavaProject javaProject) throws JavaModelException
  {
    addToClasspath(javaProject, JavaRuntime.getDefaultJREContainerEntry());
  }

  /**
   * @param javaProject
   * @throws JavaModelException
   */
  private void clearSourcePath(IJavaProject javaProject) throws JavaModelException
  {
    javaProject.setRawClasspath(new IClasspathEntry[] {}, new NullProgressMonitor()); // clean classpath, means remove
    // Project root from classpath
  }

  /**
   * @param project
   * @throws CoreException
   */
  public void addJavaNature(IProject project) throws CoreException
  {
    IProjectDescription description = project.getDescription();
    String[] natures = description.getNatureIds();
    String[] newNatures = new String[natures.length + 1];
    System.arraycopy(natures, 0, newNatures, 0, natures.length);
    newNatures[natures.length] = JavaCore.NATURE_ID;
    description.setNatureIds(newNatures);
    project.setDescription(description, new NullProgressMonitor());
  }

  /**
   * @param path
   * @param project
   * @return
   * @throws CoreException
   */
  private IClasspathEntry createSourceFolder(String path, IProject project) throws CoreException
  {
    IFolder srcFolder = project.getFolder(new Path(path));
    if (!srcFolder.exists())
    {
      srcFolder.create(false, true, null);
      IPath sourceFolderPath = srcFolder.getFullPath();
      IClasspathEntry entry = JavaCore.newSourceEntry(sourceFolderPath);

      return entry;
    }
    return null;
  }

  /**
   * @param path
   * @param project
   * @param javaProject
   * @return the created source folder
   * @throws CoreException
   */
  public IFolder createSourceFolder(String path, IProject project, IJavaProject javaProject) throws CoreException
  {
    IFolder srcFolder = project.getFolder(new Path(path));
    if (!srcFolder.exists())
    {
      srcFolder.create(false, true, null);
      IPath sourceFolderPath = srcFolder.getFullPath();
      IClasspathEntry entry = JavaCore.newSourceEntry(sourceFolderPath);
      addToClasspath(javaProject, entry);
      return srcFolder;
    }
    return null;
  }

  /**
   * @param project
   * @param javaProject
   * @throws CoreException
   * @throws JavaModelException
   */
  private void createBinFolder(IProject project, IJavaProject javaProject) throws CoreException, JavaModelException
  {
    createOutputFolder("bin", project, javaProject);
  }

  /**
   * @param project
   * @param javaProject
   * @throws CoreException
   * @throws JavaModelException
   */
  private void createOutputFolder(String path, IProject project, IJavaProject javaProject)
      throws CoreException, JavaModelException
  {
    try
    {
      IFolder binFolder = project.getFolder(new Path(path));
      if (!binFolder.exists())
      {
        binFolder.create(true, true, null);
        javaProject.setOutputLocation(binFolder.getFullPath(), null);
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  /**
   * @param name
   * @param project
   * @return the created folder
   */
  public IFolder createFolder(String name, IProject project)
  {
    IFolder folder = project.getFolder(name);

    if (!folder.exists())
    {
      try
      {
        folder.create(IResource.NONE, true, null);
      }
      catch (CoreException e)
      {
        e.printStackTrace();
      }
    }
    return folder;
  }

  public IFolder getFolder(String name, IProject project)
  {
    IFolder folder = project.getFolder(name);

    return folder;
  }

  /**
   * @param name
   * @param folder
   * @param content
   * @return the created file
   */
  public IFile createFile(String name, IFolder folder, String content)
  {
    IFile file = folder.getFile("web.xml");

    try
    {

      if (!file.exists())
      {
        byte[] bytes = content.getBytes();
        InputStream source = new ByteArrayInputStream(bytes);
        file.create(source, IResource.NONE, null);

      }
    }
    catch (CoreException e)
    {
      e.printStackTrace();
    }
    return file;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public String[] getNatures()
  {
    return natures;
  }

  public void setNatures(String[] natures)
  {
    this.natures = natures;
  }

  public ProjectCreationHelper()
  {
  }

  public static void refreshProject(IResource resource, IProgressMonitor monitor)
      throws InvocationTargetException, InterruptedException
  {
    IRunnableWithProgress op = new WorkspaceModifyOperation(null)
    {
      @Override
      protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException
      {
        try
        {
          IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
          root.refreshLocal(IResource.DEPTH_INFINITE, monitor);

        }
        catch (CoreException e)
        {

          e.printStackTrace();
        }
      }
    };
    op.run(monitor);
  }
}
