/*
 * Copyright (c) 2011, 2012, 2015 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.ecoretools.diagram.part;

import org.eclipse.emf.cdo.dawn.preferences.PreferenceConstants;
import org.eclipse.emf.cdo.dawn.ui.wizards.dialogs.CDOResourceNodeSelectionDialog;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecoretools.diagram.part.EcoreCreationWizardPage;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;

import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

import java.lang.reflect.Field;

/**
 * @author Martin Fluegge
 */
public class DawnEcoreCreationWizardPage extends EcoreCreationWizardPage
{
  private final CDOView view;

  private URI semanticModelURI;

  public DawnEcoreCreationWizardPage(String pageName, IStructuredSelection selection, CDOView view)
  {
    super(pageName, selection);
    this.view = view;
  }

  @Override
  public void createControl(Composite parent)
  {
    super.createControl(parent);
    final Text nameFd = (Text)getField("nameFd");
    // nameFd.setEnabled(false);

    nameFd.addModifyListener(new ModifyListener()
    {
      public void modifyText(ModifyEvent e)
      {
        Text directoryFd = (Text)getField("directoryFd");
        semanticModelURI = URI.createURI(directoryFd.getText() + nameFd.getText());
        setPageComplete(validatePage());
      }
    });

    URI domainModelURI = getDomainModelURI();
    setModelURI(domainModelURI);
  }

  @Override
  protected void handleDirectoryChoose()
  {
    CDOResourceNodeSelectionDialog dialog = new CDOResourceNodeSelectionDialog(getShell(), view);
    if (dialog.open() == Window.OK)
    {
      semanticModelURI = dialog.getResults();
      if (semanticModelURI != null)
      {
        setModelURI(semanticModelURI);

        loadModelFile();
      }
    }
  }

  private void setModelURI(URI semanticModelURI)
  {
    Text directoryFd = (Text)getField("directoryFd");
    directoryFd.setText(semanticModelURI.toString().replace(semanticModelURI.lastSegment(), ""));

    Text nameFd = (Text)getField("nameFd");
    nameFd.setText(semanticModelURI.lastSegment());
  }

  @Override
  protected void handleModelChoose()
  {
    CDOResourceNodeSelectionDialog dialog = new CDOResourceNodeSelectionDialog(getShell(), view, true);

    if (dialog.open() == Window.OK)
    {
      semanticModelURI = dialog.getResults();
      if (semanticModelURI != null)
      {
        Text modelFd = (Text)getField("modelFd");
        modelFd.setText(semanticModelURI.toString());

        loadModelFile();
      }
    }
  }

  @Override
  protected boolean loadModelFile()
  {
    if (semanticModelURI == null)
    {
      return false;
    }

    Resource resource = getResourceSet().getResource(semanticModelURI, true);

    if (resource != null)
    {
      ComposedAdapterFactory adapterFactory = getAdapterFactory();

      TreeViewer viewer = (TreeViewer)getField("viewer");

      // Set the tree providers of the domain file contents
      AdapterFactoryContentProvider adapterContentProvider = new AdapterFactoryContentProvider(adapterFactory);
      adapterContentProvider.inputChanged(viewer, null, null);
      viewer.setContentProvider(new WizardContentProvider(adapterContentProvider));
      viewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));

      viewer.setInput(resource.getContents());
      viewer.refresh();
      viewer.setSelection(new StructuredSelection(resource.getContents()), true);

      return true;
    }
    return false;
  }

  @Override
  protected ResourceSet getResourceSet()
  {
    return view.getResourceSet();
  }

  private Object getField(String name)
  {
    final Field fields[] = this.getClass().getSuperclass().getDeclaredFields();
    for (int i = 0; i < fields.length; ++i)
    {
      if (name.equals(fields[i].getName()))
      {
        try
        {
          fields[i].setAccessible(true);
          return fields[i].get(this);
        }
        catch (IllegalAccessException ex)
        {
          throw new RuntimeException("IllegalAccessException accessing " + name);
        }
      }
    }
    return null;
  }

  // TODO need to overwrite this
  @Override
  protected boolean validatePage()
  {
    // erase all previous messages
    setMessage(null);
    setErrorMessage(null);

    if (view.hasResource(getDomainModelURI().path()))
    {
      setErrorMessage("Resource already exists");
      return false;
    }

    // if (isNewModel())
    // {
    // return validateNewModelGroup();
    // }
    // else
    // {
    // return validateExistingModel();
    // }
    return true;
  }

  @Override
  public URI getDomainModelURI()
  {
    if (semanticModelURI == null)
    {
      String authority = PreferenceConstants.getRepositoryName();
      semanticModelURI = URI.createURI("cdo://" + authority + "/default.ecore");

      int i = 2;
      while (i < 30 && view.hasResource(semanticModelURI.path()))
      {
        semanticModelURI = URI.createURI("cdo://" + authority + "/" + "default" + i + ".ecore");
        i++;
      }
    }
    return semanticModelURI;
  }

  /**
   * Return the diagram model URI
   *
   * @return URI
   */
  @Override
  public URI getDiagramModelURI()
  {
    return URI.createURI(semanticModelURI.toString() + "diag");
  }
}
