/*******************************************************************************
 * Copyright (c) 2008, 2015 Obeo.
 * 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:
 *     Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.acceleo.internal.compatibility.ui;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.acceleo.common.AcceleoCommonPlugin;
import org.eclipse.acceleo.common.IAcceleoConstants;
import org.eclipse.acceleo.common.internal.utils.AcceleoLogger;
import org.eclipse.acceleo.common.utils.ModelUtils;
import org.eclipse.acceleo.compatibility.model.mt.Resource;
import org.eclipse.acceleo.compatibility.model.mt.ResourceSet;
import org.eclipse.acceleo.compatibility.model.mt.core.Metamodel;
import org.eclipse.acceleo.compatibility.model.mt.core.Script;
import org.eclipse.acceleo.compatibility.model.mt.core.Template;
import org.eclipse.acceleo.ide.ui.AcceleoUIActivator;
import org.eclipse.acceleo.ide.ui.popupMenus.AbstractMigrateProjectWizardAction;
import org.eclipse.acceleo.internal.compatibility.mtl.gen.Mt2mtl;
import org.eclipse.acceleo.internal.compatibility.parser.mt.ast.core.ProjectParser;
import org.eclipse.acceleo.internal.compatibility.parser.mt.common.TemplateSyntaxException;
import org.eclipse.acceleo.internal.parser.cst.utils.FileContent;
import org.eclipse.acceleo.parser.AcceleoFile;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
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.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.PlatformUI;

/**
 * An action to create automatically a new Acceleo module from an old Acceleo module (with MT files).
 * 
 * @author <a href="mailto:yvan.lussaud@obeo.fr">Yvan Lussaud</a>
 */
public class AcceleoMigrateProjectWizardAction extends AbstractMigrateProjectWizardAction {

	/**
	 * The root element of the model which describes the '.mt' files.
	 */
	private ResourceSet root;

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void browseTemplates(IProject[] projects) throws CoreException {
		List<TemplateSyntaxException> problems = new ArrayList<TemplateSyntaxException>();
		root = ProjectParser.createModel(projects, problems);
		if (problems.size() > 0) {
			StringBuffer message = new StringBuffer();
			Iterator<TemplateSyntaxException> problemsIt = problems.iterator();
			while (problemsIt.hasNext()) {
				TemplateSyntaxException templateSyntaxException = problemsIt.next();
				message.append(templateSyntaxException.toString());
				message.append("\n\n"); //$NON-NLS-1$
			}
			Status status = new Status(IStatus.ERROR, AcceleoCommonPlugin.PLUGIN_ID, message.toString());
			AcceleoLogger.log(status);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected String computeMetamodelURIs() {
		StringBuffer metamodelURIs = new StringBuffer();
		Iterator<Resource> resources = root.getResources().iterator();
		while (resources.hasNext()) {
			Resource resource = resources.next();
			if (resource instanceof Metamodel) {
				if (metamodelURIs.length() > 0) {
					metamodelURIs.append(',');
				}
				metamodelURIs.append(resource.getName());
			}
		}
		return metamodelURIs.toString();
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.acceleo.ide.ui.popupMenus.AbstractMigrateProjectWizardAction#generateMTL(org.eclipse.core.runtime.IPath,
	 *      org.eclipse.core.runtime.IPath)
	 */
	@Override
	protected void generateMTL(final IPath baseFolder, final IPath mainTemplate) {
		IRunnableWithProgress operation = new IRunnableWithProgress() {
			public void run(IProgressMonitor monitor) {
				try {
					generateMTLWithProgress(baseFolder, mainTemplate, monitor);
				} catch (CoreException e) {
					AcceleoLogger.log(e.getStatus());
				} catch (IOException e) {
					Status status = new Status(IStatus.ERROR, AcceleoCommonPlugin.PLUGIN_ID, e.getMessage()
							.toString(), e);
					AcceleoLogger.log(status);
				}
			}
		};
		try {
			PlatformUI.getWorkbench().getProgressService().run(true, true, operation);
		} catch (InvocationTargetException e) {
			IStatus status = new Status(IStatus.ERROR, AcceleoCommonPlugin.PLUGIN_ID, e.getMessage(), e);
			AcceleoCommonPlugin.getDefault().getLog().log(status);
		} catch (InterruptedException e) {
			IStatus status = new Status(IStatus.ERROR, AcceleoCommonPlugin.PLUGIN_ID, e.getMessage(), e);
			AcceleoCommonPlugin.getDefault().getLog().log(status);
		}
	}

	/**
	 * Generate the output MTL files.
	 * 
	 * @param baseFolder
	 *            is the target folder
	 * @param mainTemplate
	 *            is the main template path in the workspace
	 * @param monitor
	 *            is the monitor
	 * @throws IOException
	 *             when the model cannot be saved
	 * @throws CoreException
	 *             when a workspace issue occurs
	 */
	protected void generateMTLWithProgress(IPath baseFolder, IPath mainTemplate, IProgressMonitor monitor)
			throws IOException, CoreException {
		if (baseFolder.segmentCount() > 0
				&& ResourcesPlugin.getWorkspace().getRoot().getProject(baseFolder.segment(0)).isAccessible()) {
			IFile emtFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
					mainTemplate.removeFileExtension().addFileExtension("emt")); //$NON-NLS-1$
			IPath emtPath = emtFile.getLocation();
			ModelUtils.save(root, emtPath.toString());
			IContainer targetContainer;
			if (baseFolder.segmentCount() > 1) {
				targetContainer = ResourcesPlugin.getWorkspace().getRoot().getProject(baseFolder.segment(0))
						.getFolder(baseFolder.segment(1));
				if (!targetContainer.exists()) {
					targetContainer = emtFile.getParent();
				}
			} else {
				targetContainer = emtFile.getParent();
			}
			File targetFolder = targetContainer.getLocation().toFile();
			Mt2mtl mt2mtl = new Mt2mtl(root, targetFolder, new ArrayList<Object>());
			mt2mtl.doGenerate(BasicMonitor.toMonitor(monitor));
			if (targetContainer.isAccessible()) {
				targetContainer.refreshLocal(IResource.DEPTH_INFINITE, monitor);
			}
			IFile mainFile = ResourcesPlugin.getWorkspace().getRoot().getFile(mainTemplate);
			if (mainFile.exists()) {
				StringBuffer buffer = FileContent.getFileContent(mainFile.getLocation().toFile());
				int start = buffer.indexOf(IAcceleoConstants.DEFAULT_BEGIN + IAcceleoConstants.TEMPLATE);
				if (start == -1) {
					start = 0;
				}
				int iImport = start;
				start = buffer.indexOf(IAcceleoConstants.DEFAULT_END, start) + 1;
				int end = buffer.indexOf(IAcceleoConstants.DEFAULT_BEGIN
						+ IAcceleoConstants.DEFAULT_END_BODY_CHAR + IAcceleoConstants.TEMPLATE
						+ IAcceleoConstants.DEFAULT_END, start);
				if (end == -1) {
					end = buffer.length();
				}
				buffer.delete(start, end);
				StringBuffer newImportContent = new StringBuffer();
				StringBuffer newTemplateContent = new StringBuffer("\n\t"); //$NON-NLS-1$
				newTemplateContent.append(IAcceleoConstants.DEFAULT_BEGIN);
				newTemplateContent.append(IAcceleoConstants.COMMENT);
				newTemplateContent.append(" "); //$NON-NLS-1$
				newTemplateContent.append(IAcceleoConstants.TAG_MAIN);
				newTemplateContent.append(" "); //$NON-NLS-1$
				newTemplateContent.append(IAcceleoConstants.DEFAULT_END_BODY_CHAR);
				newTemplateContent.append(IAcceleoConstants.DEFAULT_END);
				newTemplateContent.append('\n');
				for (Resource resource : root.getResources()) {
					if (resource instanceof Template) {
						Template template = (Template)resource;
						computeImportAndTemplateCall(template, newImportContent, newTemplateContent);
					}
				}
				newImportContent.append('\n');
				newTemplateContent.append('\n');
				buffer.insert(start, newTemplateContent.toString());
				buffer.insert(iImport, newImportContent.toString());
				try {
					ByteArrayInputStream javaStream = new ByteArrayInputStream(buffer.toString().getBytes(
							"UTF8")); //$NON-NLS-1$
					mainFile.setContents(javaStream, true, false, monitor);
				} catch (UnsupportedEncodingException e) {
					throw new CoreException(new Status(IStatus.ERROR, AcceleoUIActivator.PLUGIN_ID, e
							.getMessage(), e));
				}
			}
		}
	}

	/**
	 * Creates the import sequence and the template content for the given MT template file.
	 * 
	 * @param template
	 *            is the current MT template file
	 * @param newImportContent
	 *            is the import sequence to create
	 * @param newTemplateContent
	 *            is the main template content
	 */
	private void computeImportAndTemplateCall(Template template, StringBuffer newImportContent,
			StringBuffer newTemplateContent) {
		String fileTemplateName = null;
		for (Script script : template.getScripts()) {
			if (script.getDescriptor() != null && script.getDescriptor().getFile() != null
					&& script.getDescriptor().getFile().getStatements().size() > 0) {
				fileTemplateName = script.getDescriptor().getName();
				break;
			}
		}
		if (fileTemplateName != null) {
			newImportContent.append("[import "); //$NON-NLS-1$
			String javaPackageName;
			String shortName;
			int iDot = template.getName().lastIndexOf('.');
			if (iDot > -1) {
				javaPackageName = template.getName().substring(0, iDot);
				shortName = template.getName().substring(iDot + 1);
			} else {
				javaPackageName = ""; //$NON-NLS-1$
				shortName = template.getName();
			}
			newImportContent.append(AcceleoFile.javaPackageToFullModuleName(javaPackageName, shortName));
			newImportContent.append(" /]\n"); //$NON-NLS-1$
			newTemplateContent.append("\n\t[comment Call the file block in '"); //$NON-NLS-1$
			newTemplateContent.append(shortName);
			newTemplateContent.append("' /]\n"); //$NON-NLS-1$
			newTemplateContent.append("\t[ "); //$NON-NLS-1$
			newTemplateContent.append(fileTemplateName);
			newTemplateContent.append("() /]\n"); //$NON-NLS-1$
		}
	}

}
