package bjmi.m2e.sourcelookup;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import bjmi.m2e.sourcelookup.internal.SourceLookupMessages;

/**
 * TODO (michael) document me
 *
 * TODO(michael) chose a more appropriate class name
 *
 * @author Björn Michael
 * @since 1.0
 */
public class MyMvnSourceContainerTypeDelegate extends AbstractSourceContainerTypeDelegate {

  static final String TYPE_ID = "bjmi.m2e.sourcelookup.MyMvnSourceContainerType";

  private static final String MVNCONTAINER = "mvncontainer";

  private static final String PROJECT_NAME = "projectName";

  @Override
  public ISourceContainer createSourceContainer(final String memento) throws CoreException {
    final Node node = parseDocument(memento);

    if (node.getNodeType() == Node.ELEMENT_NODE) {
      final Element element = (Element) node;

      if (MVNCONTAINER.equals(element.getNodeName())) {
        final String string = element.getAttribute(PROJECT_NAME);
        if (string == null || string.length() == 0) {
          abort(SourceLookupMessages.MyMvnSourceContainerTypeDelegate_ProjectNameIsMissing, null);
        }

        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
        final IProject project = workspace.getRoot().getProject(string);
        final IJavaProject javaProject = JavaCore.create(project);

        return new MyMvnSourceContainer(javaProject);
      }

      abort(SourceLookupMessages.myMvnSourceContainerTypeDelegate_ContainerIsMissing, null);
    }

    abort(SourceLookupMessages.MyMvnSourceContainerTypeDelegate_InvalidFormat, null);

    return null;
  }

  @Override
  public String getMemento(final ISourceContainer container) throws CoreException {
    final MyMvnSourceContainer sourceContainer = (MyMvnSourceContainer) container;
    final Document document = newDocument();
    final Element element = document.createElement(MVNCONTAINER);
    element.setAttribute(PROJECT_NAME, sourceContainer.getProjectName());
    document.appendChild(element);

    return serializeDocument(document);
  }

}