/*
 * Copyright (c) 2010-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.codegen.actions;

import org.eclipse.emf.cdo.dawn.codegen.dawngenmodel.DawnFragmentGenerator;
import org.eclipse.emf.cdo.dawn.codegen.dawngenmodel.DawnGenerator;
import org.eclipse.emf.cdo.dawn.codegen.dawngenmodel.DawngenmodelFactory;
import org.eclipse.emf.cdo.dawn.codegen.util.ProjectCreationHelper;

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.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;

/**
 * @author Martin Fluegge
 */
public abstract class GenerateDawnGenModelAction implements IObjectActionDelegate
{
  /**
   * @since 1.0
   */
  protected IResource selectedElement;

  public final static String dawngenmodelFileExtension = "dawngenmodel";

  /**
   * @since 1.0
   */
  protected final String generalPrefix = "Dawn";

  public void setActivePart(IAction action, IWorkbenchPart targetPart)
  {
  }

  public void run(IAction action)
  {
    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    try
    {
      window.run(true, true, new IRunnableWithProgress()
      {
        public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
        {
          monitor.beginTask("Generate Dawn Code", 1000);
          IFile genFile = (IFile)selectedElement;

          String genModelFile = genFile.getRawLocationURI().toString();
          String path = genModelFile.replace(genFile.getName(), "");

          ResourceSet resourceSet = createResourceSet();
          String modelname = "default";
          modelname = getModelName(genFile);

          Resource dawnGenModelResource = getResource(path, modelname, resourceSet, dawngenmodelFileExtension);
          Resource dawnFragmentModelResource = getDawnFragmentModelResource(path, modelname, resourceSet);

          DawnGenerator dawnGenerator = getDawngenerator(dawnGenModelResource);

          DawnFragmentGenerator fragmentGenerator = getDawnFragmentGenerator(genFile, resourceSet);
          fragmentGenerator.setDawnGenerator(dawnGenerator);

          dawnGenModelResource.getContents().add(dawnGenerator);
          dawnFragmentModelResource.getContents().add(fragmentGenerator);

          try
          {
            dawnGenModelResource.save(Collections.EMPTY_MAP);
            dawnFragmentModelResource.save(Collections.EMPTY_MAP);
          }
          catch (IOException ex)
          {
            throw new RuntimeException(ex);
          }

          ProjectCreationHelper.refreshProject(null, monitor);
        }

        private DawnGenerator getDawngenerator(Resource dawnGenModelResource)
        {
          DawnGenerator dawnGenerator;

          if (dawnGenModelResource.getContents().size() != 0)
          {
            dawnGenerator = (DawnGenerator)dawnGenModelResource.getContents().get(0);
          }
          else
          {
            dawnGenerator = DawngenmodelFactory.eINSTANCE.createDawnGenerator();
          }
          return dawnGenerator;
        }

      });
    }
    catch (InvocationTargetException ex)
    {
      throw new RuntimeException(ex);
    }
    catch (InterruptedException ex)
    {
      throw new RuntimeException(ex);
    }
  }

  /**
   * @since 1.0
   */
  protected abstract Resource getDawnFragmentModelResource(String path, String modelname, ResourceSet resourceSet);

  /**
   * @since 1.0
   */
  protected abstract DawnFragmentGenerator getDawnFragmentGenerator(IFile genFile, ResourceSet resourceSet);

  private String getModelName(IFile genFile)
  {
    int lastIndexOf = genFile.getName().lastIndexOf(".");
    return genFile.getName().substring(0, lastIndexOf);
  }

  /**
   * @since 1.0
   */
  protected Resource getResource(String path, String modelname, ResourceSet resourceSet, String extension)
  {
    String resourcePath = path + "" + modelname + "." + extension;
    URI uri = URI.createURI(resourcePath);
    Resource resource = null;
    try
    {
      resource = resourceSet.getResource(uri, true);
    }
    catch (Exception ignore)
    {
      // ignore
    }

    if (resource == null)
    {
      resource = resourceSet.createResource(uri);
    }
    return resource;
  }

  /**
   * @since 1.0
   */
  protected ResourceSet createResourceSet()
  {
    ResourceSet resourceSet = new ResourceSetImpl();
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(dawngenmodelFileExtension,
        new XMIResourceFactoryImpl());
    return resourceSet;
  }

  public void selectionChanged(IAction action, ISelection selection)
  {
    if (selection instanceof IStructuredSelection)
    {
      Object sel = ((IStructuredSelection)selection).getFirstElement();
      if (sel instanceof IResource)
      {
        selectedElement = (IResource)sel;
      }
    }
  }
}
